输入一串以#结尾的字符,求其中字母数字及符号的个数


#include 
#include 
int main(){
    int i=0,zf=0,sz=0,fh=0;
    char a[15]={0};
    printf("请输入一组以'#'结尾的字符:");
    for(i=0;i<15;i++){
        scanf("%c",&a[i]);
    }
    i=0;
    while(a[i]!= '#'){    
        if(a[i]>'a' && a[i]<'z' || a[i]>'A' && a[i]<'Z'){
            zf=zf+1;
        }
        else if(a[i]>'0' && a[i]<'9'){
            sz=sz+1;
        }
        else{
            fh=fh+1;
        }
        i++;
    }
    printf("数字:%d字母:%d符号:%d",sz,zf,fh);
    return 0;
}

我想问一下这串代码哪里错了,输出要按好几次回车,而且输出的结果是错的

参考GPT和自己的思路:

这段代码有几个问题:

  1. 数组a的长度只有15,但是题目中没有限定输入字符的长度,所以可能会导致越界访问;
  2. 输入的字符在缓存区中可能有残留,需要使用getchar()进行清空;
  3. 判断字母不应该使用a[i]>'a' && a[i]<'z' || a[i]>'A' && a[i]<'Z',因为这样会漏掉大写字母和小写字母之间的字符,应该改为(a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z');
  4. 在统计字符个数的时候,应该统计的是非空格字符的个数,而不是数组中所有的字符个数。

下面是修正后的代码:

#include <string.h>
#include <stdio.h>

int main(){
    int i=0,zf=0,sz=0,fh=0;
    char a[1000] = {0};
    printf("请输入一组以'#'结尾的字符:");
    getchar(); // 清空输入缓存区中的换行符
    while((a[i] = getchar()) != '#'){    
        if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z')){
            zf++;
        }
        else if(a[i]>='0' && a[i]<='9'){
            sz++;
        }
        else{
            fh++;
        }
        i++;
    }
    printf("数字:%d, 字母:%d, 符号:%d", sz, zf, fh);
    return 0;
}

参考GPT和自己的思路:

这段代码有几个问题需要修改:

  1. 数组声明的大小只有15个字符,但是要求输入以'#'结尾的字符串,因此可能会超出数组大小。
  2. 在输入时使用了scanf函数,但是它会将输入的字符缓存起来,直到按下回车才会将缓存的字符一起读入,因此输出时需要按多次回车。
  3. 对于字母的判断条件只判断了大写字母和小写字母,没有判断数字字符。
  4. 在判断数字字符时,应该使用'0'和'9'来判断。

以下是修改后的代码:


#include <string.h>
#include <stdio.h>
int main(){
    int i=0,zf=0,sz=0,fh=0;
    char a[100]={0};
    printf("请输入一组以'#'结尾的字符:");
    for(i=0;i<100;i++){
        scanf("%c",&a[i]);
        if(a[i]=='#'){
            break;
        }
    }
    i=0;
    while(a[i]!= '#'){    
        if((a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z')){
            zf=zf+1;
        }
        else if(a[i]>='0' && a[i]<='9'){
            sz=sz+1;
        }
        else{
            fh=fh+1;
        }
        i++;
    }
    printf("数字:%d 字母:%d 符号:%d\n",sz,zf,fh);
    return 0;
}

这里将数组的大小改为100,保证能够容纳输入的字符串;修改了输入和判断条件,使程序能够正确处理输入的字符;在输出中加入换行符,使结果输出更加清晰。