C语言中基于字符/字符串的if判断语句失效问题求助
问题分析与修正方案
你的代码存在三个关键问题,导致输入y/n后总是进入else分支:
- 数组长度不足:
char shChoice[1]只能容纳单个字符,但scanf("%s")读取字符串时会自动在末尾添加字符串结束符'\0',这会导致内存越界,破坏其他内存数据。需要改为char shChoice[2]来预留结束符的空间。 - scanf参数错误:
shChoice是数组名,本身就是指向数组首元素的指针,不需要加&,正确写法是scanf("%s", shChoice)。 - 字符串比较逻辑错误:C语言中不能用
==直接比较字符串内容,==比较的是两个字符串的内存地址而非内容,必须用strcmp函数(需包含<string.h>头文件);另外else if里用字符'n'和字符串shChoice比较,类型不匹配,逻辑完全错误。
修正方案1:用字符串处理
#include <stdio.h> #include <string.h> void interface() { printf("进入interface\n"); } void finalizer() { printf("进入finalizer\n"); } int main() { char shChoice[2]; // 预留空间存储字符串结束符'\0' printf("Would you like to buy something else?(y/n): "); scanf("%s", shChoice); printf("%s\n", shChoice); if (strcmp(shChoice, "y") == 0) { // 用strcmp比较字符串内容 interface(); } else if (strcmp(shChoice, "n") == 0) { finalizer(); } else { printf("Failed\n"); } return 0; }
修正方案2:用单个字符处理(更简洁)
因为只需要单个y/n字符,直接用字符类型处理更简单,避免字符串相关的问题:
#include <stdio.h> void interface() { printf("进入interface\n"); } void finalizer() { printf("进入finalizer\n"); } int main() { char shChoice; printf("Would you like to buy something else?(y/n): "); scanf(" %c", &shChoice); // 前面的空格用于跳过输入缓冲区的换行符 printf("%c\n", shChoice); if (shChoice == 'y') { // 直接比较单个字符 interface(); } else if (shChoice == 'n') { finalizer(); } else { printf("Failed\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Sedourikku
相关产品推荐
相关产品推荐

