在C中,printf在stdout“\0”上打印,但不应该

bhmjp9jg  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(168)

我用

./file.exe test.in | od -c

对于在标准输出上打印,即使是printf("someString")打印的隐藏字符,如"\t""\n",问题是即使是"\0"也会打印,但不应该。
输出:

0000000   3   1  \t   2   7  \n  \0   S   S   S   S   E   E   E   E   E
0000020   N   N   W   W   N   N   E   E   E   E   E   S   S   S   S   S
0000040   S   S   S   E  \0  \0
0000046

我试着这样打印:

printf("%d",mov);
printf("\t");
printf("%d",wets);
printf("\n");
for (i = mov; i >= 0; i--) {
   printf("%c",movement[i]);
}`

在第1-4行中,我尝试对每个需要打印字符使用printf(),而不是只使用一个printf

xlpyo6sf

xlpyo6sf1#

问题的根源似乎是for循环的奇异使用。尽可能避免所有没有惯用形式的循环:
for(size_t i=0; i<n; i++)
其他类型的循环对每个人来说都是不必要的,包括你自己。非惯用循环从不同于0的索引开始,或者在不同于<n的条件下结束,或者它们使用不同于简单++的其他迭代器修改,或者它们向下计数等。有时候没有其他的方法,那么使用其他形式也是可以的,但是不要不必要地这样做,因为代码变得更难阅读。
在你的例子中,你从一个计数器开始,向下计数,同时i>=0。这在逻辑上相当于从i=0;向上计数到i<=n,意味着增加了一个项目。在大多数情况下意味着一个数组越界访问错误。
要以相反的顺序显示某些内容,您可以像这样编写循环:

for(size_t i=0; i<mov; i++)
{
  printf("%c", movement[mov-i-1]); // -1 since arrays are 0-indexed
}

相关问题