C语言字符串比较问题:strcmp不相等、strncmp匹配过长输入
问题解决:字符串完全相等判断的正确实现
原代码的核心问题
- 数组未指定大小:
char strg1[];属于非法定义,编译会报错,必须显式指定数组容量(比如char strg1[100];),否则无法存储输入内容。 - 使用废弃的
gets函数:gets会读取任意长度的输入,极易造成缓冲区溢出,且已被C11标准移除,必须用安全的fgets替代。 - 输入带换行符导致匹配失败:原代码数组未初始化的越界问题会让
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
相关产品推荐
相关产品推荐

