C语言字符统计函数异常:返回字符串长度而非目标字符出现次数
问题分析与解决:统计字符出现次数返回字符串长度的原因
你的代码存在两个关键错误,共同导致了返回字符串长度的结果:
1. 条件判断用了赋值运算符而非比较运算符
在countLetters函数的if语句中,你错误地使用了赋值运算符=,而不是用于比较的**==**:
if(string1[i] = letter){ // 错误:将letter赋值给string1[i],而非比较
这个操作会把letter的值赋给string1[i],而赋值表达式的结果就是letter本身。只要letter不是空字符'\0',该表达式会被视为逻辑真,循环的每一次迭代都会让count加1,最终count就等于字符串的长度。
修正:将=替换为==:
if(string1[i] == letter){ // 正确:比较两个字符是否相等
2. 输入缓冲区残留换行符导致读取错误
fgets会把用户输入字符串时按下的回车键(换行符\n)一并读取到string1中。之后调用scanf("%c", &letter)时,它会直接读取输入缓冲区中残留的\n,而不是你后续输入的目标字符。结合第一个错误,此时letter的值是\n,赋值给每个字符串字符后条件始终为真,最终统计的就是字符串的长度。
修正:有两种常见解决方式:
- 方式一:在
scanf前调用getchar()丢弃换行符
printf("\nEnter character to be searched: \n"); getchar(); // 读取并丢弃fgets留下的换行符 scanf("%c", &letter);
- 方式二:在
scanf的格式字符串前加空格,自动忽略空白字符(包括换行符)
scanf(" %c", &letter); // 空格会跳过所有前置空白字符
修正后的完整代码
#include <stdio.h> #include <string.h> int countLetters(char *string1, char letter){ int count=0; for(int i=0; i<strlen(string1); i++){ if(string1[i] == letter){ // 修正比较运算符 count++; } } return count; } int main(){ char string1[200]; char letter; int count; printf("\nEnter the string: \n"); fgets(string1, 200, stdin); printf("\nEnter character to be searched: \n"); scanf(" %c", &letter); // 修正输入读取,忽略换行符 count = countLetters(string1, letter); printf("\nThe number of occurrences: %d", count); }
内容的提问来源于stack exchange,提问作者Matias04_
相关产品推荐
相关产品推荐

