Программа C не будет печатать строку, уже пробовал флеш
Программа должна получить имя и фамилию пользователя, а затем распечатать их как фамилию, имя. Программа останавливается сразу после второго ввода. Я попытался fflush (stdout), но это не сработало (возможно, я сделал это неправильно).
#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace std;
int main()
{
char First[30], Last[30];
printf("Please type in your First Name: ");
scanf("%s",&First);
fflush(stdout);
printf("Please type in your Last Name: ");
scanf("%s",&Last);
printf("%s %s", Last, First);
printf("pause");
return 0;
}
3 ответа
C++ версия вашей программы:
#include <iostream>
using namespace std;
int main()
{
string first, last;
cerr << "Please type in your First Name: ";
if (! (cin >> firs))
return -1;
cerr << "Please type in your Last Name: ";
if (! (cin >> last))
return -1;
cout << last << ' ' << first << endl;
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra i.cc
pi@raspberrypi:/tmp $ ./a.out
Please type in your First Name: aze
Please type in your Last Name: qsd
qsd aze
pi@raspberrypi:/tmp $
Я проверяю, что имена были введены (без EOF), я использую cerr, чтобы быть уверенным, что сообщения сбрасываются без записи endl
И версия C:
#include <stdio.h>
int main()
{
char first[30], last[30];
fprintf(stderr, "Please type in your First Name: ");
if (scanf("%29s", first) != 1)
return -1;
fprintf(stderr, "Please type in your Last Name: ");
if (scanf("%29s", last) != 1)
return -1;
printf("%s %s\n", last, first);
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra i.c
pi@raspberrypi:/tmp $ ./a.out
Please type in your First Name: aze
Please type in your Last Name: qsd
qsd aze
Я ограничиваю размер в scanf, чтобы не записывать из массивов, проверяю, что scanf смог прочитать имена, я также использую stderr, чтобы быть уверенным, что сообщение сбрасывается без записи '\n'
первый и последний являются массивом, бесполезно использовать '&' в scanf, чтобы дать их адрес
Обратите внимание, что эти версии не позволяют вводить составные имена, используя пробелы, чтобы разрешить чтение всей строки
fflush(stdout);
у вас ничего не получается, потому что это слишком рано в коде, так как это не помогает сбрасывать последние printfs. Вы могли бы использовать \n
чтобы покраснеть. Но это может не сработать, если ваше устройство вывода не является интерактивным, например, перенаправлено в файл.
У вас также есть другая проблема с scanf()
спецификаторы формата: First
а также Last
будучи массивами, распадаются на указатели при передаче в scanf. Таким образом, вы передаете неверный тип аргументов в scanf - просто отбросьте &
из звонков Scanf.
Таким образом, ваша программа может быть просто:
#include <stdio.h>
int main(void)
{
char First[30], Last[30];
printf("Please type in your First Name: ");
scanf("%s", First);
fflush(stdout);
printf("Please type in your Last Name: ");
scanf("%s", Last);
fflush(stdout);
printf("%s %s\n", Last, First);
fflush(stdout);
getchar();
return 0;
}
Все fflush(stdout)
звонки могут не понадобиться, если вы могли бы использовать \n
во всех вызовах printf, потому что вы, вероятно, используете интерактивный терминал.
Если вы используете C++, вы действительно должны использовать iostream для ввода-вывода. Если ничего другого, scanf ужасен, имеет много проблем и его следует избегать.
Это помогает подумать о цели вызова fflush(). Есть ожидающие данные, которые вы хотите, чтобы пользователь видел, чтобы они знали, что печатать.
Давайте рассмотрим первый запрос (printf, scanf, flush). Printf() помещает данные в буфер. Затем scanf() читает ответ пользователя. Flush () не будет выполняться до тех пор, пока пользователь не наберет что-нибудь.
Эти три звонка в неправильном порядке. Я оставлю это как упражнение для читателя.
Теперь рассмотрим следующий запрос (printf, scanf). Printf() помещает данные в буфер. Scanf () читает ответ пользователя, но пользователь еще не видел подсказку "... Фамилия:".
Очевидно, что в этом блоке также есть ошибка. Опять же, я оставлю это как упражнение для читателя. Подсказка: если вы исправили первую ошибку, это должно помочь вам понять вторую.
Кстати, scanf() не защищает от переполнения массивов First[] и Last[]. Нет необходимости отвечать на ваш первоначальный вопрос, но я упоминаю об этом, потому что даже после того, как вы исправили код, он останется небезопасным.