c语言字符串遍历不到最后一个字符,求大佬们帮帮忙

void StringCount(char* s) { //string str = s; int a = 0;//大写字母个数 int b = 0;//小写字母个数 int c = 0;//空格个数 int d = 0;//数字个数 int z = 0;//其他字符个数 int i=0; while(1){ if (s[i] >= 'A' && s[i] <= 'Z') { a++; } else if (s[i]>='a'&&s[i]<='z') { b++; } else if (s[i]==' ') { c++; } else if (s[i]>='0'&&s[i]<='9') { d++; } else { z++; } i++; if(s[i] == '\0'){goto u;} } u: printf("%d %d %d %d %d",a,b,c,d,z); //cout << a << " " << b << " " << c << " " << d << " " << z;}

你想把最后一个结束符号0也计算在z变量里,那么循环里

 i++;if(s[i] == '\0')goto u;这两句位置颠倒一下写成:if(s[i] == '\0')goto u;i++;

另外,你这代码有改进的地方:

1、代码尽量不要用goto跳转,循环中想要跳出去结束整个循环,用break语句。同理想要跳过本次循环进入下一次循环,可以continue语句。

2、if else执行效率不高,特别是if判断多且字符串长的时候,这里单纯用if判断,在每个条件成立++后添加continue语句直接跳到下一次循环(下面的判断就不用判断了)。

3、结束符号也可直接用0表示。

如下代码(方法不止一种):

void StringCount(char* s)

{

    int a = 0;//大写字母个数

    int b = 0;//小写字母个数

    int c = 0;//空格个数

    int d = 0;//数字个数

    int z = 0;//其他字符个数

    int i=-1;

    while(1)

    {

        ++i;

        if (s[i]>='A'&&s[i]<= 'Z'){a++;continue;}

        if (s[i]>='a'&&s[i]<='z'){b++;continue;}

        if (s[i]==' '){c++;continue;}

        if (s[i]>='0'&&s[i]<='9'){d++;continue;}

        z++;

        if (s[i]==0)break;//这里是把结束符号也算进z,如不想算进z和z++位置颠倒

    }

    printf("%d %d %d %d %d",a,b,c,d,z);

}

       

温馨提示:答案为网友推荐,仅供参考
相似回答