Программа C не будет печатать строку, уже пробовал флеш - PullRequest
0 голосов
/ 16 февраля 2019

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

0 голосов
/ 16 февраля 2019

Помогает подумать о цели вызова fflush ().Есть ожидающие данные, которые вы хотите, чтобы пользователь видел, чтобы они знали, что печатать.

Давайте рассмотрим первый запрос (printf, scanf, flush).Printf () помещает данные в буфер.Затем scanf () читает ответ пользователя.Функция flush () не будет выполняться до тех пор, пока пользователь не введет что-либо.

Эти три вызова расположены в неправильном порядке.Я оставлю исправление для читателя в качестве упражнения.

Теперь рассмотрим следующий запрос (printf, scanf).Printf () помещает данные в буфер.Scanf () читает ответ пользователя, но пользователь еще не видел приглашение «... Фамилия:».

Очевидно, что в этом блоке также есть ошибка.Опять же, я оставлю это как упражнение для читателя.Подсказка: если вы исправили первую ошибку, которая должна помочь вам понять вторую.

Кстати, scanf () не защищает от переполнения массивов First [] и Last [].Нет необходимости отвечать на исходный вопрос, но я упоминаю об этом, потому что даже после исправления кода он останется небезопасным.

0 голосов
/ 16 февраля 2019

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 ужасен, имеет много проблем, и его следует избегать .

0 голосов
/ 16 февраля 2019

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'

first и last являются массивом, бесполезно использовать '&' в scanf, чтобы дать их адрес


Обратите внимание, что эти версии не позволяют вводить составные имена, используя пробелы, чтобы разрешить чтение всей строки

...