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

函数内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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:57:25