将null-terminator视为C中的常规字符

时间:2014-09-21 17:05:24

标签: c arrays null cstring null-terminated

我想将char []中的所有字符复制到另一个char []。但是,假设有一个'\ 0'然后我想把它当作一个普通字符 - 如果你愿意的话,那就是文字。 因此,当我使用格式说明符%s打印出char []时,它不应该在中间停止。 e.g。

// chars copied to array x
char x[] = {'h','e','\0','l','l','o','\0'}

printf("%s\n",x); // prints 'he\0llo'

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:1)

您需要明智地打印数组元素,将不可打印的字符转换为您想要查看的内容。

打印出he\0llo\0执行:

char x[] = {'h','e','\0','l','l','o','\0'};

for (size_t i = 0; i < sizeof(x); ++i)
{
  if ('\0' == x[i])
  {
    printf("%s", "\\0");
  }
  else
  {
    printf("%c", x[i]);
  }
}

答案 1 :(得分:1)

如果您知道需要复制多少个字符,请使用memcpy。如果x是一个真实数组,sizeof(x)将为您提供该数量,但如果您将x作为参数传递给函数,则sizeof将无效在该函数内部(它只显示指针的大小),所以基本规则是你的字符串应该是NUL终止的,或者你应该将它们的大小保存在一个单独的变量中。

对于打印,您可以按@alk建议在for循环中打印,或使用fwrite将任何缓冲区(可能带有NUL)写入stdout

fwrite(x, sizeof(x), 1, stdout); /* sizeof will work only for a real array */

答案 2 :(得分:1)

错误地使用"%s"。在第一个空字符或printf("%s"之后,无法使用'\0'打印包含数据的数组。

char x[] = {'h','e','\0','l','l','o','\0'}
printf("%s\n",x);  // This only prints "he"

printf("%s",...用于打印字符串。 x是一个字符串,仅包括第一个'\0'

要“将char []中的所有字符复制到另一个char []。”,请使用memcpy()

char x[] = {'h','e','\0','l','l','o','\0'}
char y[sizeof x];

memcpy(y, x, sizeof x);

代码可以使用"%c"来打印所有内容,但使用'\0'打印的内容因系统而异。

size_t i;
for (i=0; i< sizeof x; i++) 
  printf("%c", x[i]);