如何在main函数中正确打印Concat函数生成的新拼接序列?
问题分析与解决方案
核心错误原因
- 当触发
sequence[0] == piece[1]的条件时,你执行了sequence = strcat(piece, sequence)——这只是让函数内部的sequence指针指向了piece数组的地址,但main函数里的sequence数组完全没被修改。C语言中数组作为参数传递时,修改函数内部的指针变量不会影响外部的数组,此时拼接结果存在piece里,但main依然打印原sequence数组,自然输出错误。 - 另外,原代码里的
sequence = strcat(...)完全多余,strcat会直接修改目标数组的内容,不需要重新给指针赋值。
修正方案
我们需要确保不管哪种拼接逻辑,最终结果都写入到main传入的sequence数组中,具体修正后的代码如下:
完整修正代码
#define BUFFER 50 #include <string.h> #include <stdio.h> int Concat(char sequence[], char piece[]) { int sequenceValid = 1; int lenSeq = strlen(sequence); int lenPiece = strlen(piece); // 提前检查缓冲区是否足够,避免溢出 if (lenSeq + lenPiece >= BUFFER) { return 0; } if (sequence[lenSeq - 1] == piece[0]) { // 直接把piece拼到sequence末尾 strcat(sequence, piece); } else if (sequence[0] == piece[1]) { // 要把piece放在前面,先保存原sequence到临时缓冲区 char temp[BUFFER]; strcpy(temp, sequence); // 把piece复制到sequence开头 strcpy(sequence, piece); // 再把原sequence内容拼到后面 strcat(sequence, temp); } else { sequenceValid = 0; } return sequenceValid; } int main() { char piece[BUFFER], sequence[BUFFER]; scanf("%s", sequence); scanf("%s", piece); if (Concat(sequence, piece)) { printf("%s", sequence); } else { printf("piece %s cannot be added to %s.", piece, sequence); } return 0; }
关键修改说明
- 新增缓冲区溢出检查:计算两个字符串长度之和,若超过缓冲区大小直接返回无效,避免内存溢出风险。
- 重构第二种拼接逻辑:
- 用临时数组
temp保存原sequence内容,防止被覆盖。 - 先将
piece复制到sequence数组,再把原sequence内容拼到后面,确保最终结果存在sequence里,main打印时能获取正确拼接结果。
- 用临时数组
测试验证
输入:
166335 21
此时sequence[0]与piece[1]均为'1',触发第二种拼接逻辑,最终sequence数组内容为21166335,与期望输出一致。
内容的提问来源于stack exchange,提问作者RandomDeveloper
相关产品推荐
相关产品推荐

