我想将 char[] 中的所有字符复制到另一个 char[]。但是,假设有一个 '\0' 那么我想把它当作一个普通字符——如果你愿意的话。因此,当我打印出带有格式说明符 %s 的 char[] 时,它不应该停在中间。例如
// chars copied to array x
char x[] = {'h','e','\0','l','l','o','\0'}
printf("%s\n",x); // prints 'he\0llo'
有没有办法做到这一点?
我想将 char[] 中的所有字符复制到另一个 char[]。但是,假设有一个 '\0' 那么我想把它当作一个普通字符——如果你愿意的话。因此,当我打印出带有格式说明符 %s 的 char[] 时,它不应该停在中间。例如
// chars copied to array x
char x[] = {'h','e','\0','l','l','o','\0'}
printf("%s\n",x); // prints 'he\0llo'
有没有办法做到这一点?
memcpy
如果您知道需要复制多少个字符,请使用。Ifx
是您示例中的真实数组,sizeof(x)
将为您提供该数量,但是如果您将x
其作为参数传递给函数,sizeof
则在该函数内将不起作用(它只会显示指针的大小),因此基本规则是您的字符串应该以 NUL 结尾,或者您应该将它们的大小保存在单独的变量中。
对于打印,您可以for
按照@alk 的建议在循环中打印,或者使用fwrite
将任何缓冲区(可能带有 NUL)写入stdout
:
fwrite(x, sizeof(x), 1, stdout); /* sizeof will work only for a real array */
您需要明智地打印数组元素,将不可打印的字符转换为您想看到的任何内容。
要打印出来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]);
}
}
错误使用"%s"
. 没有办法用于printf("%s"
在第一个空字符或'\0'
.
char x[] = {'h','e','\0','l','l','o','\0'}
printf("%s\n",x); // This only prints "he"
printf("%s",...
用于打印字符串。 x
是一个字符串,直到并包括 first '\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]);