输入一个字符串,内有数字和非数字,例如:A123x456 17960,将其中连续的数字作为一个整数,依次放到一数组a中。例如,123放在a[0],456放在a[1],统计共有多少个整数,并输出这些数。

代码如下:

#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;
}

调试结果为:

猜你喜欢

转载自blog.csdn.net/hi332516_1/article/details/121873654
今日推荐