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

C语言仅用指针实现返回最长字符串功能输出乱码,该怎么解决?

问题定位

你的代码存在两处核心错误:

  • 字符串长度统计完成后,p1、p2指针已经移动到了字符串末尾的\0位置,你直接返回这两个指针,相当于返回了字符串结束符的地址,后续打印时从结束符开始读取非法内存,自然输出乱码。
  • main函数的打印循环条件写错:你判断的是指针length本身不等于\0,但实际应该判断指针指向的内容*length不等于\0;且没有对返回的NULL做判空处理,长度相等时会触发空指针访问崩溃。

修复方案

完全遵循指针操作要求,不使用数组语法,修改逻辑如下:

  1. 统计字符串长度时,保留原字符串首地址,统计完成后返回对应首地址而非末尾地址。
  2. 打印前先判断返回指针是否为NULL,非NULL再遍历打印每个字符。

修正后代码

#include<stdio.h>

char* string_ln(char*, char*);
 
int main() {
    char str1[20];
    char str2[20];
    char* res;
   
    scanf("%s%s", str1, str2);
   
    res = string_ln(str1, str2);
    // 先判空,避免空指针访问
    if (res == NULL) {
        return 0;
    }
    // 循环条件判断指针指向的内容是否为结束符
    while (*res != '\0') {
        printf("%c", *res);
        res++;
    }
    return 0;
}
 
char* string_ln(char*p1, char*p2) {
    // 先保存两个字符串的首地址
    char *origin1 = p1;
    char *origin2 = p2;
    int count1 = 0;
    while (*p1 != '\0') {
        count1++;
        p1++;
    }
   
    int count2 = 0;
    while (*p2 != '\0') {
        count2++;
        p2++;
    }
   
    if (count1 > count2) {
        // 返回首地址而非移动后的末尾指针
        return origin1;
    }
    else if (count2 > count1) {
        return origin2;
    }
    else {
        return NULL;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:00:06