Программа 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[]. Нет необходимости отвечать на ваш первоначальный вопрос, но я упоминаю об этом, потому что даже после того, как вы исправили код, он останется небезопасным.

Другие вопросы по тегам