запуск программы в Unix против Windows - PullRequest
4 голосов
/ 12 мая 2010

Я собираю простую программу, написанную на C, и использую Eclipse в качестве IDE, как в Windows 7, так и на моем MacBook Pro. Очень простая программа, которую написал мой друг и попросил меня помочь ему:

int a = 0;
char b[2];
printf("Input first class info:\n");
printf("Credit Hours: \n");
scanf("%d", &a);
printf("Letter Grade: ");
scanf("%s", b);

Так что, когда я запускаю это на своем Mac, печатает каждая строка, и когда я сталкиваюсь со scanf (), я могу ввести и продолжить, как и ожидалось. В Windows я должен ввести все, и тогда он напечатает все строки. Я не уверен, почему это происходит ... в чем разница ч / б Windows и Mac здесь?

Mac:

Input first class info:
Credit Hours: 4
Letter Grade: B+

Windows

4
B+
Input first class info:
Credit Hours:
Letter Grade:

Спасибо, Христо

Ответы [ 7 ]

3 голосов
/ 12 мая 2010

Как упомянуто этой веткой в Windows:

Вам нужно fflush(stdout) после вашего звонка на printf().

Также из-за ошибки 27663 выполнение printf() на консоли Eclipse не сбрасывается до тех пор, пока буфер printf () не заполнится. С консолью Windows связаны различные ошибки: ошибка 102043 и ошибка 121454 .

1 голос
/ 12 мая 2010

Я предполагаю, что в Mac OS X "\ n" приводит к сбросу стандартного вывода, тогда как в Windows это не так. Попробуйте добавить следующий фрагмент кода после операторов print и перед операторами scanf:

fflush(stdout);
1 голос
/ 12 мая 2010

Windows и Mac по-разному буферизуют вывод консоли. Если вы хотите, чтобы он появился немедленно, вам нужно сбросить его, позвонив по номеру

fflush(stdout);

после печати. ​​

1 голос
/ 12 мая 2010

Вероятно, это связано с различиями в кэшировании буфера.

Попытка:

fflush(stdout);

перед вашим scanfs. Это заставит выводиться на экран, когда вам нужно его увидеть.

0 голосов
/ 12 мая 2010

В дополнение к ответам о необходимости fflush() - ваш код содержит переполнение буфера. Функция scanf () в b записывает 3 байта - { 'B', '+', '\0' } - и в вашем массиве недостаточно места для хранения терминатора NUL. Вам нужен буфер шириной 3 символа, или использовать что-то отличное от scanf(%s) с символом a для чтения 2 символов.

0 голосов
/ 12 мая 2010

Как сказал Федор, это, скорее всего, проблема с окончанием строки.

В Windows окончание строки - "\ r \ n" (возврат каретки с последующим переводом строки).

В Mac OSX окончание строки просто "\ r", но "\ r \ n" также работает, потому что оно включает "\ r".

В Unix / Linux конец строки обычно просто "\ n".

0 голосов
/ 12 мая 2010

Вы хотите использовать \r\n вместо \n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...