我试图复制一些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
,以便了解那里发生了什么...
我已经搜索过这些符号了,但是什么也没找到。它们不是内存垃圾,因为结果总是一样的。
4条答案
按热度按时间7gcisfzg1#
cat
的-e
选项告诉它使用特定的表示法来打印不可打印的字符。^@
表示值0,^A
表示值1,^B
表示值2。这些值正是您给出的值。ibps3vxo2#
Simply cat使用插入符号显示不可打印的字符。
^A
表示 1,^Z
表示 26。^@
表示 0,^_
^?
kupeojn63#
我的意思是为什么
printf
打印^@而我得到'\0'(?)printf("%c", 0);
将 * null字符 * 打印到stdout
。查看stdout
的输出时看到的不是stdout
的一部分,而是shell/终端程序的实现细节。打印printf()
的返回值以了解它打印了多少字符。可能在stderr
上将其与stdout
分开。输出似乎正常,只有3个空格,数字被忽略。
"似乎"需要更多细节。* 只有3 * 是如何确定的?
但是将printf输出到文件中,...
文件的长度是多少?6?
...则使用"cat-e文件"执行以下操作:
请参考@dbush good answer来解释为什么您现在看到"^@^ A ^B"。
我使用memset来替换字符。
不清楚,因为问题中没有
memset()
。fhg3lkii4#
得到了解决。多亏了这里的解释,我意识到即使我用write()打印结果字符串,我也是用指针来迭代它的,所以从来没有给过机会真正传递那个空字符。
然后write()正确地完成了任务:
现在我也知道了插入符号,谢谢大家!