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

在MacOS 11.6.1上使用strncat追加字符时输出异常的问题

问题分析与解决

你的代码问题出在strncat的使用逻辑上:strncat要求第二个参数必须是以\0结尾的合法字符串,但你传入的是单个字符ch的地址&ch——该地址指向的内存只有s这一个字符,没有字符串终止符\0。这种情况下,strncat会从&ch开始读取数据,虽然你指定了仅复制1个字符,但后续未知的内存内容可能触发未定义行为(比如程序提前崩溃),导致最后一行printf无法执行。

虽然你的数组str[6]大小刚好能容纳"Geeks"加终止符,但错误的strncat调用已经破坏了程序的正常执行流程。

修复方案

你可以选择两种更安全的方式实现字符追加:

方案1:手动追加字符(直观且高效)

直接定位字符串末尾,赋值字符后手动添加终止符:

// C program to Append a Character to a String

#include <stdio.h>
#include <string.h>

int main()
{
    // declare and initialize string
    char str[6] = "Geek";

    // declare and initialize char
    char ch = 's';

    // print string
    printf("Original String: %s\n", str);
    printf("Character to be appended: %c\n", ch);

    // 手动追加:先获取字符串长度,确保有剩余空间后赋值并添加终止符
    size_t len = strlen(str);
    if (len < sizeof(str) - 1) {
        str[len] = ch;
        str[len + 1] = '\0';
    }

    // print string
    printf("Appended String: %s\n", str);

    return 0;
}

方案2:正确使用strncat

将单个字符包装成带终止符的合法字符串后传入:

// C program to Append a Character to a String

#include <stdio.h>
#include <string.h>

int main()
{
    // declare and initialize string
    char str[6] = "Geek";

    // 将单个字符包装为带终止符的字符串
    char ch_str[] = {'s', '\0'};

    // print string
    printf("Original String: %s\n", str);
    printf("Character to be appended: %c\n", ch_str[0]);

    // 合法调用strncat,源参数为标准字符串
    strncat(str, ch_str, 1);

    // print string
    printf("Appended String: %s\n", str);

    return 0;
}

两种方案都能保证程序正常执行,输出你预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:35:40