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

使用strcmp函数无输出,直接比较指针却显示Same的问题求助

问题分析与解决:scanf使用错误导致的未定义行为

核心错误根源

你写的两段代码都存在致命问题:

  • 定义的char *i, *j;是未初始化的野指针,本身没有指向任何有效的可写内存空间。
  • scanf("%s %s", &i, &j);的参数类型完全不匹配:%s格式符要求传入一个指向可写字符数组的char*指针,用来存储输入的字符串,但你传入的是&i和&j(即char**类型的指针)。

这种错误会让scanf直接把输入的字符串内容写入指针变量i和j本身的内存空间(比如32位系统下指针变量占4字节),一旦输入字符串长度超过指针变量的大小,就会造成内存溢出,触发未定义行为——这就是两段代码出现异常的根本原因。

为什么直接比较指针会输出"Same"?

这是未定义行为的偶然表现:scanf错误修改了i和j的内存值,可能因为输入的两个字符串被错误写入后,i和j的数值(即指针地址)恰好变成相同值,导致i == j成立,输出"Same"。但这个结果完全不可靠,换输入或运行环境后结果可能完全不同。

为什么用strcmp会无输出?

调用strcmp(i, j)时,函数会尝试解引用i和j这两个指针,但此时它们指向的是非法内存区域(被破坏的栈内存或无效地址),程序会触发段错误(Segmentation Fault)直接崩溃,来不及执行printf就退出,因此没有任何输出。

修正后的代码示例

静态字符数组版本(推荐,简单安全)

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

int main(void)
{
    // 定义足够大的字符数组存储输入,避免溢出
    char i[100], j[100];
    
    // 数组名会隐式转换为指向首元素的char*指针,符合scanf的参数要求
    scanf("%s %s", i, j);
    
    if (strcmp(i, j) == 0){
        printf("Same\n");
    } else {
        printf("different\n");
    }
    return 0;
}

动态内存分配版本(适合不确定输入长度的场景)

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

int main(void)
{
    char *i = NULL, *j = NULL;
    // 分配足够内存存储输入(假设输入不超过99字符+结束符)
    i = malloc(100 * sizeof(char));
    j = malloc(100 * sizeof(char));
    
    if (i == NULL || j == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    
    scanf("%s %s", i, j);
    
    if (strcmp(i, j) == 0){
        printf("Same\n");
    } else {
        printf("different\n");
    }
    
    // 释放动态分配的内存,避免内存泄漏
    free(i);
    free(j);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:45:34