谭浩强C语言第五版的一些课后习题

第八章 第十六题

输入一个字符串,含有数字和非数字,将连续的数字作为一个整数存放到数组中,并统计有多少个整数,然后输出

int main(){
	char str[50],*p;
	printf("输入字符串\n");
	gets(str);
	p=str;
	int i=0,j=0,k,e10;  //j记录位数个数 k记录当前位数  e10为当前数字需要乘的10的倍数 
	int dig;//dig 保存字符转为的数字 
	int a[10],*pp=a;//a用于保存数字, 
	int m;
	int ans=0;//表示总共整数有几个 
	while(*(p+i)!='\0'){
		if((*(p+i)>='0')&&(*(p+i)<='9')){
			j++;  //记录位数有多少个 
		}
		else{  //到非数字 
			if(j>0){   //并且有位数 
				dig=*(p+i-1)-48;  //前一个为数字 且为个位上的数字
				k=1;
				while(k<j){  //j位数  k表示当前是第几位 
					e10=1;
					for(m=1;m<=k;m++) e10=e10*10; //退出时e10为当前第k+1位需要乘的倍数
					dig=dig+(*(p+i-1-k)-48)*e10;
					k++;
				} //退出循环时 整数已经得到 即为dig
				//赋值操作
				*pp=dig;
				ans++;  //总数增加 
				pp++;
				j=0; //重置位数判断 
			}
		}
		i++;   //不管什么情况 指针后移 
	}//退出字符串循环
	//注意 这里如果是数字结尾的字符串,j是有值的 
	//但是不会统计最后 因为到'\0'就退出了 还没到else
	if(j>0){   //将该种情况加入数据
	    dig=*(p+i-1)-48;
				k=1;
				while(k<j){   
					e10=1;
					for(m=1;m<=k;m++) e10=e10*10;
					dig=dig+(*(p+i-1-k)-48)*e10;
					k++;
				} 
				*pp=dig;
				ans++; 
				pp++;
				j=0; 
	}//特殊情况结束
	printf("统计结果有%d个数字:\n",ans);
	pp=a;//将pp重新指向开头
	for(i=0;i<ans;i++){
		printf("%d ",*(pp+i));
	} 
	printf("\n");
	return 0;
}

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐