我有这段代码 -
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
char *letter_data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char a[16];
strncpy(a, letter_data, sizeof(a)+1);
printf("The first sixteen letters are: %s\n", a);
return 0;
}
当我在这里编译时 - http://www.compileonline.com/compile_c_online.php
对于[4],[5],[6],[10]等,我只是得到了字母,我期待。但是,对于除此之外的任何数字,例如a [7],a [8],a [16]等,我在字符串后面会得到奇怪的垃圾。我不知道垃圾来自哪里。这是C的东西还是在线编译器?
我希望这个垃圾是每个字符串末尾的空字符,但垃圾不是1个字符长,也不是常量。我想知道那是什么。
答案 0 :(得分:2)
strncpy
不会将目标序列置零。由于目标不是以零结尾,因此它不是字符串。尝试将其视为字符串会导致未定义的行为。这就是你观察到的。
此外,strncpy
的目的是作为转换函数从零终止字符串格式到固定宽度字符串格式。它并非旨在并且从未打算用作有限长度(&#34;安全&#34;)字符串复制功能。一般情况下的strncpy
输出不是字符串。这正是您遇到的问题。
您可以在此处详细了解固定宽度字符串以及strncpy
的真正目的:https://stackoverflow.com/a/2886982/187690
请勿尝试使用strncpy
进行有限长度的字符串复制。检查您的平台是否提供strlcpy
或自己实施strlcpy
模拟。