代码如下:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <assert.h>
int Get_str_Num_Count(const char *str) //子函数为统计一长串字符串中整数的个数
{
int count = 0; //首先初始化数字个数为0
while(*str != '\0') //停步准则:从字符串的首地址开始遍历,当遇到'\0'时就停止
{
if(isdigit(*str) && !isdigit(*(str+1)))
//我们要输出整数的个数,那么就要判断什么样子的字符才是整数,那就是同时满足两个条件:1.当前位置的字符所表示的是数字,2.他所在位置的下一个位置不是数字,那么我们就可以认为这是一个数字
{
count++; //从而计数器++
}
str++; //while循环的步进 这一条一定不能忘记,while循环容易忘记的地方就是没有步进
}
return count; //最后把记录的数字个数返回
}
int *Get_str_Num(const char *str) //子函数为统计一长串字符串中整数的内容
{
bool tag = false; //立一个标签为假
int n = Get_str_Num_Count(str); //此处就是用到的上一个记录数字的子函数
int *arr = (int *)malloc(n*sizeof(int)); //申请动态内存arr来存储每一个整数
int sum = 0; //首先初始化整数为0
int k = 0; //k表示数组arr的下标
while(*str != '\0') //停步准则:从字符串的首地址开始遍历,当遇到'\0'时就停止
{
if(isdigit(*str)) //首先先判断字符串某一位是否为数字,若是数字执行下面的操作
{
tag = true; //先改变标签为真
sum = sum*10 + (*str-'0');
//记录数字 这一步刚好满足若是连续的数字就可以输出这一串数字 此处为什么要字符串-'0',是因为此时的数字是字符数字,减去'0'之后就变为数字了
}
else
{
if(tag) //如果标签为真
{
arr[k] = sum; //就把sum的值给arr[k]
k++; //k继续往后步进
sum = 0; //重置sum为0
tag = false; //重置标签为假
}
}
str++; //while循环的步进
}
if(tag) //为什么这里又出现一步判断标签为真的操作 这是因为while循环的最后遇到了'\0',而刚好最后有时就是一串数字,那么这就导致最后的一串数字无法输出,这就出现bag了,所以最后一定要判断标签是否为真,若是的话就把醉的这串数字输出来
{
arr[k] = sum; //就把sum的值给arr[k]
}
return arr; //最后返回数组arr
}
int main()
{
const char *str = "000A123x456 17960? 302ta0b5876"; //给定字符串
int *p = Get_str_Num(str); //把从字符串中得到的整数给p
int len = Get_str_Num_Count(str); //获取数字的个数给len
for(int i=0; i<len; i++)
{
printf("%d\n", p[i]); //输出每一个整数
}
return 0;
}
调试结果为: