C语言字符计数重复累加问题:代码异常排查与修复求助
问题修复方案
问题描述
我想要编写一段C语言代码,逐个统计输入的字符,不计空格和作为终止标记(MARK)的“.”。但当前代码中i+=hitungkarakter的累加逻辑会重复计数:直接输入“.”时运行正常,输入其他字符则出现重复计数情况,示例输入输出如下:
f 1 m 2 3 k 4 5 . 6
当前代码
#include "boolean.h" #include <stdio.h> #define MARK '.' char currentChar; boolean EOP; void ADV(){ if(currentChar == MARK){ EOP = true; } else{ scanf("%c",¤tChar); } } void START(){ scanf("%c",¤tChar); if(currentChar == MARK){ EOP = true; } } char GetCC(){ return currentChar; } boolean IsEOP(){ return (currentChar==MARK); } int hitungkarakter(char karakter) { int i = 0; if(karakter != " " && karakter != MARK){ i++ ; } return i; } int main(){ START(); int i = 0; while(!IsEOP()){ i+=hitungkarakter(currentChar); ADV(); printf("%d\n",i); } }
错误分析与修复步骤
1. 字符比较逻辑错误(核心问题)
hitungkarakter函数中,karakter != " "是字符与字符串字面量的地址比较,而非字符值比较,这个条件永远为真,导致空格无法被排除。同时输入时的换行符'\n'(回车)也会被当成有效字符计数,这是重复计数的主要原因。
修复:将" "改为' '(单引号包裹的单个空格字符),同时添加对换行符'\n'的判断,排除回车干扰:
int hitungkarakter(char karakter) { int i = 0; if(karakter != ' ' && karakter != '\n' && karakter != MARK){ i++ ; } return i; }
2. 未初始化EOP变量
START函数中,当读取的初始字符不是MARK时,EOP变量未被赋值,其值为未定义状态,可能导致循环逻辑异常。
修复:在START函数中统一初始化EOP状态:
void START(){ scanf("%c",¤tChar); EOP = (currentChar == MARK); }
3. ADV函数逻辑优化
原ADV函数仅在当前字符是MARK时设置EOP,读取新字符后未更新EOP状态。调整逻辑,确保每次读取新字符后都判断是否到达终止标记:
void ADV(){ scanf("%c",¤tChar); EOP = (currentChar == MARK); }
4. 优化打印逻辑(可选)
原main函数中每次循环都会打印计数,包括处理回车时的情况。添加判断,仅在处理有效字符后打印,避免多余的空计数输出:
int main(){ START(); int i = 0; while(!IsEOP()){ int add = hitungkarakter(currentChar); i += add; ADV(); // 仅在统计到有效字符时打印 if(add > 0){ printf("%d\n",i); } } }
修复后的完整代码
#include "boolean.h" #include <stdio.h> #define MARK '.' char currentChar; boolean EOP; void ADV(){ scanf("%c",¤tChar); EOP = (currentChar == MARK); } void START(){ scanf("%c",¤tChar); EOP = (currentChar == MARK); } char GetCC(){ return currentChar; } boolean IsEOP(){ return EOP; } int hitungkarakter(char karakter) { int i = 0; if(karakter != ' ' && karakter != '\n' && karakter != MARK){ i++ ; } return i; } int main(){ START(); int i = 0; while(!IsEOP()){ int add = hitungkarakter(currentChar); i += add; ADV(); if(add > 0){ printf("%d\n",i); } } }
内容的提问来源于stack exchange,提问作者Bread
相关产品推荐
相关产品推荐

