C语言 尝试复制可变参数的printf行为

xwbd5t1u  于 2023-01-29  发布在  其他
关注(0)|答案(4)|浏览(123)

我试图复制一些printf功能用于教学目的,但是我遇到了一些我无法理解的printf行为。
有这样一个电话:

printf(" %c %c %c", 0, 1, 2); // yes, parameters are ints not chars.

输出似乎正常,只有3个空格,数字被忽略。
但是将printf输出到一个文件,然后使用“cat -e file”执行以下操作:

^@ ^A ^B

^@表示0,^A表示1,^B表示2,依此类推。

我的问题是,这些符号是什么?它们与价值观有什么关系?
我自己的printf也是这样做的**除了0,它被视为“\0”**字符...我需要准确地模拟printf,以便了解那里发生了什么...
我已经搜索过这些符号了,但是什么也没找到。它们不是内存垃圾,因为结果总是一样的。

7gcisfzg

7gcisfzg1#

cat-e选项告诉它使用特定的表示法来打印不可打印的字符。^@表示值0,^A表示值1,^B表示值2。这些值正是您给出的值。

ibps3vxo

ibps3vxo2#

Simply cat使用插入符号显示不可打印的字符。^A表示 1^Z表示 26^@表示 0

  • 27 -x一米三英寸
  • 28 -x一米四英寸
  • 29 -x一米五英寸
  • 30 -x一米六英寸一x
  • 31 - ^_
  • 127 - ^?
kupeojn6

kupeojn63#

我的意思是为什么printf打印^@而我得到'\0'(?)
printf("%c", 0);将 * null字符 * 打印到stdout。查看stdout的输出时看到的不是stdout的一部分,而是shell/终端程序的实现细节。打印printf()的返回值以了解它打印了多少字符。可能在stderr上将其与stdout分开。

int count = printf(" %c %c %c", 0, 1, 2);
fprintf(stderr, "<%d>\n", count);

输出似乎正常,只有3个空格,数字被忽略。
"似乎"需要更多细节。* 只有3 * 是如何确定的?
但是将printf输出到文件中,...
文件的长度是多少?6?
...则使用"cat-e文件"执行以下操作:
请参考@dbush good answer来解释为什么您现在看到"^@^ A ^B"。
我使用memset来替换字符。
不清楚,因为问题中没有memset()

fhg3lkii

fhg3lkii4#

得到了解决。多亏了这里的解释,我意识到即使我用write()打印结果字符串,我也是用指针来迭代它的,所以从来没有给过机会真正传递那个空字符。

write(STDOUT_FD, delta, d_length);

然后write()正确地完成了任务:

make test > check.txt && cat -e check.txt
own: ^@ ^A ^B$
lib: ^@ ^A ^B$

现在我也知道了插入符号,谢谢大家!

相关问题