在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
相关产品推荐
相关产品推荐

