C语言回文判断程序循环跳过输入,是否需要重置对应变量?
故障根因
这是C语言标准输入缓冲区残留导致的典型问题:
- 调用
scanf_s("%d", &decide)读取数字时,函数仅会提取输入流中匹配的整数字符,用户输入数字后按下的换行符\n会残留在输入缓冲区中 - 下一轮循环执行
fgets(string, ARR_SIZE, stdin)时,fgets遇到换行符会直接结束读取,相当于读入了空内容,没有获取用户的新输入,因此直接输出了和上一轮相同的判断结果。
修复方案
在scanf_s读取完重启选项后,增加清空输入缓冲区的逻辑,把残留的换行符和多余字符全部清理掉即可,同时建议每次循环前清空存储字符串的数组,避免旧内容残留干扰结果。
修改后的main函数代码如下:
int main(void) { char string[ARR_SIZE]; char returnstring[ARR_SIZE]; int decide; int ret; do { // 每次循环清空数组,避免旧内容残留 memset(string, 0, ARR_SIZE); memset(returnstring, 0, ARR_SIZE); printf("Enter a string!\n"); fgets(string, ARR_SIZE, stdin); isAlphabet(string, returnstring); smol(returnstring); ret = isPalindrom(returnstring); if (ret == 1) printf("Palindrom!\n"); else printf("Not a Palindrom\n"); printf("Do you want to restart? Yes = 1, No = 0 "); scanf_s("%d", &decide); // 新增:清空输入缓冲区残留的所有字符直到换行 while (getchar() != '\n'); } while (decide == 1); return 0; }
额外优化提示
你现有代码中isPalindrom函数里的inputString[strlen(inputString)] = '\0'是冗余操作,字符串本身已经以\0结尾,这行代码不会产生实际效果可以删除。
内容的提问来源于stack exchange,提问作者notmenotyou
相关产品推荐
相关产品推荐

