为什么 putchar() 在这个简单的代码中要写一个新行?
Why is putchar() writing a new line in this simple code?
我不明白为什么当我 运行 这个程序时,为什么要将过多的白色 space 写入标准输出。
int main(int argc, char **argv)
{
argv++;
for (int i = 0; i < argc - 1; i++)
{
for (int j = 0; j < strlen(*argv); j++)
{
putchar(*(*(argv + i) + j));
}
printf("\n");
}
}
输出:
(base) benjamin@benjamin-G5-5587:~$ ./uecho hello world baby yoyoyo
hello
world
baby
//whitespace?
yoyoy
你的内循环条件错误,导致你读取越界。它总是受第一个参数 strlen(*argv)
的限制(感谢较早的 argv++
),即使在处理第二个和后续参数时也是如此。由于您读出了 "hello"
的长度,因此您阅读了 "baby"
,并且无法阅读全部 "yoyoyo"
。一个字符过度读取 baby
最终将 NUL
写入 stdout
,我猜您的终端正在以类似于换行符的方式进行解释。
我建议:
- 解决问题,以便使用每个参数的长度来打印它,并且
- 用简单的数组索引语法代替难以理解的指针算法
最终结果如下:
int main(int argc, char **argv)
{
for (int i = 1; i < argc; i++) // Adjust bounds to loop over provided args without mucking with argv directly
{
for (int j = 0; j < strlen(argv[i]); j++) // Loop to length of current arg
{
putchar(argv[i][j]);
}
printf("\n");
}
}
我不明白为什么当我 运行 这个程序时,为什么要将过多的白色 space 写入标准输出。
int main(int argc, char **argv)
{
argv++;
for (int i = 0; i < argc - 1; i++)
{
for (int j = 0; j < strlen(*argv); j++)
{
putchar(*(*(argv + i) + j));
}
printf("\n");
}
}
输出:
(base) benjamin@benjamin-G5-5587:~$ ./uecho hello world baby yoyoyo
hello
world
baby
//whitespace?
yoyoy
你的内循环条件错误,导致你读取越界。它总是受第一个参数 strlen(*argv)
的限制(感谢较早的 argv++
),即使在处理第二个和后续参数时也是如此。由于您读出了 "hello"
的长度,因此您阅读了 "baby"
,并且无法阅读全部 "yoyoyo"
。一个字符过度读取 baby
最终将 NUL
写入 stdout
,我猜您的终端正在以类似于换行符的方式进行解释。
我建议:
- 解决问题,以便使用每个参数的长度来打印它,并且
- 用简单的数组索引语法代替难以理解的指针算法
最终结果如下:
int main(int argc, char **argv)
{
for (int i = 1; i < argc; i++) // Adjust bounds to loop over provided args without mucking with argv directly
{
for (int j = 0; j < strlen(argv[i]); j++) // Loop to length of current arg
{
putchar(argv[i][j]);
}
printf("\n");
}
}