You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:02:02