C程序使用scanf("%s")、strlen统计字符不计数空格的问题求助
问题原因
你的代码运行结果不符合预期主要有两个核心原因:
- 输入函数逻辑限制:
scanf("%s", name)读取输入时遇到空格、制表符、换行符就会自动停止,所以输入John Snow时,仅读取到空格前的John就终止了,数组里只存了4个字符,自然统计结果不对。 - 语法错误:原代码存在多处语法问题,包括
int counter=0末尾漏分号、for循环未闭合右大括号、最终打印计数的语句漏分号,也会导致编译或运行异常。另外原代码中scanf("%s",&name)里的&是多余的,数组名本身就代表数组首地址,不需要额外取地址。
入门级解决方案
不需要使用内存操作相关函数,只要将输入函数替换为可以读取整行内容的fgets()即可,该函数可以读取包含空格的输入,且自带缓冲区长度限制,适合入门使用。
修正后的完整代码如下:
#include <stdio.h> #include <string.h> int main() { char name[100]; int counter = 0; printf("Enter name and surname:"); // fgets参数说明:存储数组、最大读取长度、输入流(stdin代表键盘输入) fgets(name, sizeof(name), stdin); int len = strlen(name); // 可选操作:去掉fgets读取到的末尾换行符,避免统计多余的换行 if (len > 0 && name[len - 1] == '\n') { name[len - 1] = '\0'; len--; } for(int i = 0; i < len; i++){ printf("%c \n", name[i]); counter++; } printf("总字符数:%d", counter); return 0; }
输入John Snow测试时,会依次打印每个字符包括中间的空格,最终统计结果为10,符合你的预期。
内容的提问来源于stack exchange,提问作者D. K.
相关产品推荐
相关产品推荐

