C代码执行时重复触发if-else的else分支问题求助
问题:C程序始终执行else分支,持续输出"ano??"
运行编写的C代码时,程序始终重复执行if-else语句的else分支,仅持续输出"ano??"。已尝试用sscanf防止缓冲区溢出,但问题未解决,在Sublime Text、Turbo C、VS Code等环境测试均出现相同问题。
相关代码如下:
#include <stdio.h> #include <stdbool.h> #include <string.h> #include <time.h> void anongArawNgayon() { time_t now = time(NULL); char* anongAraw = ctime(&now); printf("%s", anongAraw); } int scanner(const char *data, char *buffer, size_t buflen) { char format[30]; if (buflen == 0) return 0; snprintf(format, sizeof(format), "%%%ds", (int)(buflen-1)); return sscanf(data, format, buffer); } int main() { char input[30]; bool tuloyLang = true; anongArawNgayon(); while (tuloyLang) { printf("\n"); printf("di makapagdrive si papa, tuloy ba bukas?\n"); sscanf("%29s", input, sizeof(input)); if(strcmp(input, "tuloy")==0) { for (int i=0; i=15; i++) { printf("Okay magbihis na kayo\n"); } printf("pero si adriaan ang magdridrive"); } else if(strcmp(input, "hindi")==0) { for (int i=0; i=15; i++) { printf("Patay ah"); } printf("commute na lang"); } else if(strcmp(input, "sira")==0) { break; } else { printf("ano??"); } } return 0; }
问题分析
- 输入读取错误:
sscanf("%29s", input, sizeof(input))用法完全错误。sscanf的第一个参数是要解析的数据源字符串,而非格式字符串。这导致input从未被正确赋值为用户输入,strcmp无法匹配任何预设值,直接进入else分支。 - for循环条件错误:
for (int i=0; i=15; i++)中的i=15是赋值操作,而非判断条件。赋值后i恒为15(非零),会导致循环无限执行,即使输入匹配了"tuloy"或"hindi",程序也会卡死在循环里。 - 未使用定义的scanner函数:你定义了scanner函数但未调用,该函数用于从字符串读取内容,而你需要读取用户输入,应使用scanf或fgets。
修复后的代码
#include <stdio.h> #include <stdbool.h> #include <string.h> #include <time.h> void anongArawNgayon() { time_t now = time(NULL); char* anongAraw = ctime(&now); printf("%s", anongAraw); } int main() { char input[30]; bool tuloyLang = true; anongArawNgayon(); while (tuloyLang) { printf("\n"); printf("di makapagdrive si papa, tuloy ba bukas?\n"); // 使用fgets读取用户输入,避免缓冲区溢出 if (fgets(input, sizeof(input), stdin) == NULL) { break; } // 移除fgets读取到的换行符,避免影响strcmp匹配 input[strcspn(input, "\n")] = '\0'; if(strcmp(input, "tuloy")==0) { for (int i=0; i<15; i++) // 修正循环条件,执行15次后结束 { printf("Okay magbihis na kayo\n"); } printf("pero si adriaan ang magdridrive\n"); } else if(strcmp(input, "hindi")==0) { for (int i=0; i<15; i++) // 修正循环条件 { printf("Patay ah\n"); } printf("commute na lang\n"); } else if(strcmp(input, "sira")==0) { break; } else { printf("ano??\n"); } } return 0; }
关键修改说明
- 替换错误的sscanf调用为
fgets,确保正确读取用户输入,同时限制读取长度避免缓冲区溢出。 - 用
strcspn移除fgets读取的换行符,否则输入内容会带有换行,导致strcmp匹配失败。 - 把所有for循环的
i=15改为i<15,让循环执行15次后正常结束。 - 在printf末尾添加换行符,优化输出格式。
内容的提问来源于stack exchange,提问作者francis245
相关产品推荐
相关产品推荐

