题目:输入一个字符串,内有数字和非数int字符,如a123x456,将其中连续的数作为一个整数,依次存放到整形数组a中。
例:123存放在a[0],456存放在a[1]。统计共有多少整数,并输出这些整数
首先分析题目,基本要素有:
含有数字和非数字符的字符串,
整数,
存放整数的整形数组。
需要操作的部分或得到的东西为:得到字符串中的
连续数字(连续是个问题,个人理解单个数字不考虑了),
整数的个数(这里很好统计,额外定义一个int变量计数,或者和a下标共用计数,比较最终下标计数+1就是整数个数),
输出整数(很简单的整形数组循环输出);
下面分析一下代码,思路和结果不唯一,仅代表一种个人思考角度:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a[10]; //定义一个整形数组来存得到的整数
char *p=NULL; //用指针遍历字符数组更方便,记得初始化,警惕野指针
printf("请输入一段带数字的字符串:");
char s[20]; //定义字符数组
scanf("%[^\n]",s); //终端输入字符串,采用消除垃圾字符的输入方式
p=s;//让指针指向字符数组首地址
int sum=0,i=0; //定义整数合成器sum和a下标i,并利用i计数
while(*p!='\0') //采用while循环作为遍历驱动
{
if(*p<='9'&&*p>='0') //判断指针是不是数字
{
if(*(p+1)>='0'&&*(p+1)<='9') //判断数字是否连续并且不移动指针
{
while(*p<='9'&&*p>='0') //对当前连续的数字部分遍历
{
sum=sum*10+*p-48; //利用ASCII让单独的数字字符成为有意义的整数,数字字符-48=整形数字,sum=sum*10这步就是让数字升位,循环后得到的sum就是转换完成的整数
p++; //让p指向下一个数字推进遍历
} //当p指向的非数字时获得1个整数sum
a[i]=sum; //将当前整数存储进数组中
sum=0; //清空sum以获得接下来的整数
i++; //从a[0]开始存,a[i]在变化
}
}
p++; //当前非数字时指针后移继续下面的判断
}
printf("共有%d个整数:",i); //这里i本来是表示下标,理论上最大下标+1才是元素个数,但因为循环结束前i又自加了一次,所以现在的i就是元数个数。
for(int j=0;j<i;j++)
printf("%d ",a[j]); //循环输出数组a内容
printf("\n");
return 0; //结束程序
}
测试结果:
这是我参加的c基础培训day13的练习题,题目不难,顺着思路写一遍就能跑,但是也明显感觉到自己有初学者的不好习惯和错误,望大佬和同僚指正,互相学习,共勉!