C语言 输入一行字符串,里面有些数值(包括整数和浮点数)被其它字符分隔开了,一串数字间最多一个小数点,统计出其中数值的个数。

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