C语言输入一行字符串,里面有些数值(包括整数和浮点数)被其它字符分隔开了,一串数字间最多一个小数点,统计出其中数值的个数。
你直接挨个对每一个字符进行判断,是不是大于等于0,小于等于9,用一个变量a记录出现的个数如果是直接加1,遇到小数点记录一下,最后如果有小数点,a-1,如果没有直接输出a
在输入的时候注意使用,gets(),输入字符串,因为字符串中可能有空格
题目描述:输入一行字符串,里面有些数值(包括整数和浮点数)被其它字符分隔开了,一串数字间最多一个小数点,统计出其中数值的个数。
输入:输入一行字符串。
输出:输出格式:输出字符串中的数值个数,整型格式。
样例输入:aa123456bb.34cc5.6dd..ee
样例输出:3
以下是我的解题思路,如有不对的地方可在评论区讨论:
首先将这行字符串中的字符、数字和小数点分别标记为0、1和2。
如样例则可以标记为001111110021100121002200,这样就便于后面的判断。代码如下(一些不好理解的地方我已经写好注释了):
#include <stdio.h>
#include <stdlib.h>
int main(){
char a[100];
gets(a);
int len=strlen(a);
int i;
int flag[100]={0};
for(i=0;i<len;i++){
if(a[i]>'0' && a[i]<'9'){
flag[i]=1;//将数值标记为1;
}else if(a[i]=='.'){
flag[i]=2;//将小数点标记为2;
}
}
int cnt=0;//设置计数器
if(len==1 && flag[0]==1){//当只有1个字符时
printf("1");
}else if(len==2){//当只有2个字符时
int flagP=0;
for(i=0;i<len;i++){
if(flag[i]==1){
flagP=1;//有数则置flagP为1;
}
}
if(flagP==1){
printf("1");
}
}else{//当3个及以上字符时
for(i=0;i<len;i++){//从i遍历到len
//前后两个flag不同,且满足前一个为非小数点或者前两个为非数值非小数点;
//避免以下情况
//1.如5.6即flag为121时,错将其判断为2个数字;
//2.如aa.56,即flag为00211时,错将其判断为0个数字;
if((flag[i]!=flag[i+1]) && ((flag[i]!=2) || (flag[i-1]==0))){
//满足上一个if且后一个flag为1,即后一个是数值时
if((flag[i+1]==1)){
cnt++;
}
}
}
//如果第一个字符是数字,那么还要加上1
//避免情况:5a5a5,即flag为10101,错将其判断成2个数字。
if(flag[0]==1){
cnt++;
}
printf("%d",cnt);
}
return 0;
}