C语言程序空格计数异常:总字符与空格统计如何修复?
C语言字符统计程序:总字符数与空格数统计错误的修复方案
嘿,我一眼就揪出问题的根源了——你用来读取输入的scanf("%s", cMessage)是罪魁祸首!
问题核心原因
scanf("%s")会把空格、制表符、换行符当成输入结束的分隔符,这就导致:
- 它只会读取输入中第一个空格之前的内容,后面的字符(包括空格本身)根本不会被存入
cMessage数组 - 直接造成空格数统计为0,总字符数也只统计了第一个空格前的片段,完全不符合实际输入情况
具体修复步骤
我给你两个关键修改点,再附上完整的修复代码:
1. 替换输入函数为fgets()
fgets()可以读取整行输入,包括空格,语法如下:
fgets(cMessage, sizeof(cMessage), stdin);
2. 处理fgets()读取到的换行符
fgets()会把用户按下回车的\n也读进数组里,我们需要把这个多余的换行符替换成字符串结束符\0,避免统计错误:
// 找到换行符的位置并替换 size_t len = strlen(cMessage); if (len > 0 && cMessage[len-1] == '\n') { cMessage[len-1] = '\0'; len--; // 更新长度,去掉换行符的计数 }
3. 总字符数的统计
你可以直接用处理后的len值作为总字符数,也可以在循环里同步计数,两种方式都能得到正确结果。
完整修复后的代码
#include<stdio.h> #include<string.h> #include <ctype.h> int main(){ // 修正为标准的int返回类型 char cMessage[100]; int cTotal=0, cLow=0, cUp=0, cSpec=0, cSpace=0, cNum=0; printf("Enter your message: "); // 用fgets读取整行输入,包含空格 fgets(cMessage, sizeof(cMessage), stdin); // 处理fgets读取到的换行符 size_t len = strlen(cMessage); if (len > 0 && cMessage[len-1] == '\n') { cMessage[len-1] = '\0'; len--; // 更新长度,排除换行符 } // 遍历每个字符完成统计 int x=0; while(x < len){ if(islower(cMessage[x])){ cLow++; } else if(isupper(cMessage[x])){ cUp++; } else if(isspace(cMessage[x])){ cSpace++; } else if(isdigit(cMessage[x])){ cNum++; } else { cSpec++; } x++; } cTotal = len; // 总字符数直接取处理后的字符串长度 // 输出统计结果 printf("\n统计结果:\n"); printf("总字符数:%d\n", cTotal); printf("小写字母:%d\n", cLow); printf("大写字母:%d\n", cUp); printf("空格数:%d\n", cSpace); printf("数字:%d\n", cNum); printf("特殊字符:%d\n", cSpec); return 0; // 标准main函数需要返回值 }
额外优化提示
- 我把
main()的返回类型改成了标准的int,并加上了return 0;,这是C语言的规范写法 - 去掉了不必要的
#include<conio.h>,这个头文件不是标准C的一部分,很多编译器不支持
内容的提问来源于stack exchange,提问作者Ed Hernandez
相关产品推荐
相关产品推荐

