为什么 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,我猜您的终端正在以类似于换行符的方式进行解释。

我建议:

  1. 解决问题,以便使用每个参数的长度来打印它,并且
  2. 用简单的数组索引语法代替难以理解的指针算法

最终结果如下:

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");
    }
}