函数内strcat失效原因及代码咨询:字符串拼接反转实现
问题解答
关于'\0'的疑问
- 不需要手动添加。
scanf("%10s", ...)读取字符串时,会自动在输入的单词末尾添加'\0'作为字符串结束符,strlen、strcat等字符串函数依赖这个结束符正常工作,所以无需手动追加。
代码问题排查与修正
你的代码存在几个关键问题,逐一说明并修正:
1. concatWords函数的逻辑错误
你在函数内重新给w1分配内存,但这是局部变量赋值,不会影响外部传入的word1;同时还有两个致命问题:
- 计算内存长度时未预留'\0'的位置,malloc的内存大小应该是
总字符数 + 1,否则拼接后的字符串会因缺少结束符导致未定义行为。 - 新malloc的内存未初始化,直接调用
strcat会读取垃圾数据,正确流程是先复制第一个单词,再依次拼接后两个。
修正后的concatWords函数:
char* concatWords(char *w1, char *w2, char *w3) { int len = strlen(w1) + strlen(w2) + strlen(w3) + 1; // +1 预留'\0'位置 char* result = (char*)malloc(sizeof(char) * len); strcpy(result, w1); // 先复制第一个单词 strcat(result, w2); // 拼接第二个单词 strcat(result, w3); // 拼接第三个单词 return result; }
2. printReversedWord函数的输出错误
循环内你写的printf("%c", word);会持续输出word指针指向的第一个字符,正确写法应该是通过索引word[i]访问对应位置的字符:
void printReversedWord(char *word) { int len = strlen(word); for (int i = len - 1; i >= 0; i--) { printf("%c", word[i]); } printf("\n"); // 添加换行让输出更整洁 }
3. 输入读取的细节确认
scanf("%10s", w1)中的%10s对应N=10,而word1的大小是N+1=11,刚好能容纳10个字符加'\0',这部分逻辑是正确的。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 10 void initWords(char *w1, char *w2, char *w3) { printf("Enter first word:\n"); scanf("%10s", w1); printf("Enter second word:\n"); scanf("%10s", w2); printf("Enter third word:\n"); scanf("%10s", w3); } char* concatWords(char *w1, char *w2, char *w3) { int len = strlen(w1) + strlen(w2) + strlen(w3) + 1; char* result = (char*)malloc(sizeof(char) * len); strcpy(result, w1); strcat(result, w2); strcat(result, w3); return result; } void printReversedWord(char *word) { int len = strlen(word); for (int i = len - 1; i >= 0; i--) { printf("%c", word[i]); } printf("\n"); } int main() { char word1[N+1]; char word2[N+1]; char word3[N+1]; char* longWord; initWords(word1, word2, word3); longWord = concatWords(word1, word2, word3); printReversedWord(longWord); free(longWord); return 0; }
内容的提问来源于stack exchange,提问作者elyaz98
相关产品推荐
相关产品推荐

