C语言仅用指针实现返回最长字符串功能输出乱码,该怎么解决?
问题定位
你的代码存在两处核心错误:
- 字符串长度统计完成后,
p1、p2指针已经移动到了字符串末尾的\0位置,你直接返回这两个指针,相当于返回了字符串结束符的地址,后续打印时从结束符开始读取非法内存,自然输出乱码。 - main函数的打印循环条件写错:你判断的是指针
length本身不等于\0,但实际应该判断指针指向的内容*length不等于\0;且没有对返回的NULL做判空处理,长度相等时会触发空指针访问崩溃。
修复方案
完全遵循指针操作要求,不使用数组语法,修改逻辑如下:
- 统计字符串长度时,保留原字符串首地址,统计完成后返回对应首地址而非末尾地址。
- 打印前先判断返回指针是否为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
相关产品推荐
相关产品推荐

