15个字符为什么从源到目的地有strcpy的垃圾?

时间:2014-07-31 18:00:40

标签: c

我有这段代码 -

#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个字符长,也不是常量。我想知道那是什么。

1 个答案:

答案 0 :(得分:2)

如果源字符串中有足够的数据来填充缓冲区,则

strncpy不会将目标序列置零。由于目标不是以零结尾,因此它不是字符串。尝试将其视为字符串会导致未定义的行为。这就是你观察到的。

此外,strncpy的目的是作为转换函数从零终止字符串格式到固定宽度字符串格式。它并非旨在并且从未打算用作有限长度(&#34;安全&#34;)字符串复制功能。一般情况下strncpy输出不是字符串。这正是您遇到的问题。

您可以在此处详细了解固定宽度字符串以及strncpy的真正目的:https://stackoverflow.com/a/2886982/187690

请勿尝试使用strncpy进行有限长度的字符串复制。检查您的平台是否提供strlcpy或自己实施strlcpy模拟。