为何不将continueFlag加入函数三元运算符时循环仅执行一次?
问题原因分析
你的checkWord函数里的quitFlag逻辑存在明显问题——它只要有任意一个字符和"done"对应位置相等,就会被设为1,哪怕其他字符完全不匹配。
举个实际例子:你输入"dabc",第一个字符'd'和quitWord[0]匹配,quitFlag就变成1了;后面三个字符不匹配,continueFlag变成1,但你只判断quitFlag==1,函数直接返回1,主循环的while(flag==0)条件不满足,循环直接终止,自然只会运行一次。
而加上&& continueFlag == 0的时候,相当于要求所有字符都匹配——只要有一个字符不匹配,continueFlag就会是1,条件不成立,函数返回0,循环就能继续执行。
修正后的代码逻辑
其实你完全可以简化这个判断逻辑,不需要两个flag,直接实现"只有输入完全等于done时才返回1"的需求:
#include <stdio.h> #include <string.h> // 引入字符串比较的标准库 int checkWord(char userInput[]); int main() { int flag = 0; char userInput[30]; do { printf("Speak: "); scanf("%s", userInput); flag = checkWord(userInput); } while (flag == 0); return 0; } int checkWord(char userInput[]) { // 用strcmp直接比较两个字符串,完全匹配返回0,所以这里转成1/0返回 return strcmp(userInput, "done") == 0 ? 1 : 0; // 如果不想用标准库,手动循环判断的严谨写法: // char quitWord[] = "done"; // for (int i = 0; i < 4; i++) // { // if (quitWord[i] != userInput[i]) // { // return 0; // 有一个字符不匹配,直接返回0 // } // } // // 额外检查输入的字符串是否刚好到第4位结束,避免"donexxx"这种情况被误判 // return userInput[4] == '\0' ? 1 : 0; }
注意:原代码还有个隐藏隐患——如果用户输入长度超过4的字符串(比如"done123"),原逻辑会错误认为匹配,而用strcmp或者手动检查终止符的写法,能避免这种误判。
内容的提问来源于stack exchange,提问作者chickpea
相关产品推荐
相关产品推荐

