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

C语言程序输入YES/NO始终输出无效响应问题求助

C语言字符串比较问题排查与修复

你遇到的问题核心是字符串比较方式错误,再加上变量类型定义错误,导致程序永远走else分支。下面逐个分析错误点并给出修复方案:

错误原因拆解

1. 字符串不能用==比较

C语言中,==运算符比较的是两个指针的内存地址,不是字符串的内容。你写的response == "YES",其实是在比较response数组的首地址和字符串字面量"YES"的地址,这两个地址永远不会相等,所以条件永远不成立。

要比较字符串内容,必须用标准库函数strcmp(),它会逐字符对比两个字符串,返回值为0时表示内容完全相同。使用前需要包含头文件<string.h>。

2. 变量类型定义错误

  • 测试代码1里,response被定义为int response[3],这是整数数组,不是用来存字符串的字符数组。用gets()往int数组里写入字符串会直接导致内存访问错误,类型完全不匹配。应该改成char response[10](预留足够空间存输入内容和字符串结束符\0)。
  • 测试代码2里,int response = "NO."是把字符串的指针地址赋值给int变量,类型不兼容,会导致地址被截断,完全无法正确存储字符串。同样要改成char数组。

3. gets()函数的安全隐患

gets()是已被废弃的危险函数,它不检查输入长度,一旦输入超过数组容量就会造成缓冲区溢出,引发程序崩溃或安全问题。建议用fgets()替代,同时注意处理输入末尾的换行符。

修复后的代码示例

#include <stdio.h>
#include <string.h>  // 必须包含strcmp所需的头文件

int main()
{
    char response[10];  // 改为字符数组,预留足够空间
    char password[15];
    
    printf("Insert Password with 8 characters:");
    fgets(password, sizeof(password), stdin);  // 用fgets替代gets
    // 去掉fgets读取的换行符
    password[strcspn(password, "\n")] = '\0';
    
    printf("Your current password is:'%s',do you want to keep it?(YES or NO.):", password);
    fgets(response, sizeof(response), stdin);
    response[strcspn(response, "\n")] = '\0';  // 处理换行符
    
    if (strcmp(response, "YES") == 0) {  // 用strcmp比较字符串内容
        printf("password stored 'not actually lol'\n");
    }
    else if (strcmp(response, "NO.") == 0) {
        printf("we dont know what else you want to do.\n");
    }
    else {
        printf("Not a valid response.\n");
    }
    return 0;
}

关键修改说明

  • 把response改为char类型数组,匹配字符串存储需求。
  • 用strcmp()替代==做字符串内容比较。
  • 用fgets()替代gets(),并通过strcspn()去掉输入末尾的换行符(因为fgets会把回车也读入数组)。

内容的提问来源于stack exchange,提问作者yonx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:16:31