C语言猜数字游戏如何正确读取用户输入的y/n确认回复?
代码存在的核心问题
- 未初始化的指针越界:你声明了
char* response;字符指针,但没有为其分配有效的内存空间,直接通过scanf向该指针指向的未知地址写入内容属于未定义行为,会导致程序崩溃或者运行结果异常。你只需要存储单个输入字符,不需要用指针,直接声明char response;普通字符变量即可。 - 字符/字符串比较逻辑错误:你使用
response == "y"做判断,这里有两个错误:- 双引号包裹的
"y"是C语言的字符串常量,实际存储的是'y' + '\0'两个字符,和单个字符类型不匹配 - 就算你用指针存储字符串,
==比较的是两个指针的内存地址,不是实际的字符串内容,永远不会相等,所以不管你输入什么都会走else分支把running设为false,这就是你程序无论输入什么都会直接终止的原因。
- 双引号包裹的
- 输出格式符不匹配:你用
%s输出单个字符,和变量类型不匹配,会导致输出异常。
修复后的完整代码
#include <stdio.h> #include <stdbool.h> int main() { int num = 5; /* temp placeholder for testing */ int guess; char response; // 改为普通字符变量,不需要指针 bool running = true; while (running) { printf("Guess a number: "); scanf("%d", &guess); if (guess < num) { printf("That's too low.\n\n"); } else if (guess > num) { printf("That's too high.\n\n"); } else { printf("That is correct.\n\n"); guess = 0; printf("Play again? (y/n): "); scanf(" %c", &response); // 传入字符变量的地址 printf("Response: [%c]\n", response); // 用%c输出单个字符 // 和单引号包裹的字符常量比较 if (response == 'y') { running = true; } else { running = false; } } } return 0; }
内容的提问来源于stack exchange,提问作者Der Noobermeister
相关产品推荐
相关产品推荐

