Трафаретная печать сбивает с толку ?

#c #fflush

#c #fflush

Вопрос:

мой код :

 #include <stdio.h>
void main( int argc, char** argv) {
    printf("%s", argv[0]);
    system("pwd");
}
 

Вывод:

 [river@localhost studio]$ ./a.out 
/home/river/Desktop/studio
./a.out[river@localhost studio]$
 

Кажется, что system («pwd») сначала печатает, затем печатает argv[0] . почему?
Если я добавлю оператор, подобный следующему :

 #include <stdio.h>

    void main( int argc, char** argv) {
        printf("%s", argv[0]);
        fflush(stdout);
        system("pwd");
    }
 

Вывод :

 [river@localhost studio]$ ./a.out 
./a.out/home/river/Desktop/studio
 

Это работает нормально, почему?

Ответ №1:

printf Вызов помещает выходные данные только в буфер. Чтобы буфер действительно был записан, его необходимо очистить. Вывод автоматически сбрасывается при печати новой строки, поэтому, если вы замените строку формата в printf на this: "%sn" она должна работать без вызова to fflush .

Комментарии:

1. … и вызов «system» не очищает выходной поток и даже не использует выходной поток — команда, вызываемая «system», записывается непосредственно и немедленно на консоль, затем буфер очищается, когда программа завершается, и отображается строка, которую вы напечатали.

Ответ №2:

Другой способ «исправить» это:

 printf("%sn", argv[0]);
 

Дело в том, что стандартный вывод по умолчанию имеет линейный буфер.

См.: