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

C语言字符串比较问题:strcmp不相等、strncmp匹配过长输入

问题解决:字符串完全相等判断的正确实现

原代码的核心问题

  1. 数组未指定大小:char strg1[]; 属于非法定义,编译会报错,必须显式指定数组容量(比如char strg1[100];),否则无法存储输入内容。
  2. 使用废弃的gets函数:gets会读取任意长度的输入,极易造成缓冲区溢出,且已被C11标准移除,必须用安全的fgets替代。
  3. 输入带换行符导致匹配失败:原代码数组未初始化的越界问题会让strcmp结果不可预测;即便改用合法数组,gets虽会丢弃换行符,但如果用户输入的字符串本身存在格式问题,也会导致匹配失败;而fgets会把回车符\n读入字符串,这也是直接用strcmp总是不相等的常见原因。

正确的解决思路

要实现完全相等的判断,必须满足两个条件:输入字符串和目标字符串的每个字符完全一致,且长度相同。具体步骤:

  • 用fgets安全读取输入,避免缓冲区溢出。
  • 移除fgets读取到的换行符(因为用户输入回车后,\n会被加入字符串,而目标字符串"football"不含该字符)。
  • 用strcmp直接比较,该函数会同时检查字符内容和长度,只有完全一致时才返回0。

修正后的完整代码

#include <stdio.h>
#include <string.h>

int main()
{
    char strg1[100]; // 指定足够大的数组容量,避免溢出
    char strg2[] = "football";

    printf("Enter first string: ");
    fgets(strg1, sizeof(strg1), stdin); // 替代gets的安全输入函数

    // 移除fgets读取到的换行符(如果存在)
    strg1[strcspn(strg1, "\n")] = '\0';

    if(strcmp(strg1, strg2) == 0)
    {
        printf("\nEqual");
    }
    else
    {
        printf("\nNot Equal");
    }

    return 0;
}

额外优化:提前拦截超长输入

如果想提前过滤掉长度超过目标字符串的输入(比如"footballABC"),可以先判断长度再比较,逻辑更清晰:

#include <stdio.h>
#include <string.h>

int main()
{
    char strg1[100];
    char strg2[] = "football";
    const size_t target_len = strlen(strg2);

    printf("Enter first string: ");
    fgets(strg1, sizeof(strg1), stdin);
    strg1[strcspn(strg1, "\n")] = '\0';

    const size_t input_len = strlen(strg1);
    if (input_len == target_len && strcmp(strg1, strg2) == 0)
    {
        printf("\nEqual");
    }
    else
    {
        printf("\nNot Equal");
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:35:18