Как я могу исправить эту проблему с буферизацией ввода? - PullRequest
0 голосов
/ 09 марта 2020

У меня проблема с моим кодом, когда выходные данные будут печатать операторы раньше, чем я хочу, и мне сообщили, что это связано с буферизацией ввода и что добавление пробела перед "%" в моем scanf приведет к решить проблему, но это все еще повторяющаяся проблема.

printf («Пожалуйста, введите имя контакта:»); scanf ("% 31s", name.firstName);

printf("Do you want to enter a middle initial(s)? (y or n): ");
scanf(" %c", &option);


if (option == 'y' || option == 'Y')
{
printf("Please enter the contact's middle initial(s): ");
scanf("  %7s", name.middleInitial);
}

printf("Please enter the contact's last name: ");
scanf(" %36s", name.lastName);


// Contact Address Input:

printf("Please enter the contact's street number: ");
scanf(" %d", &address.streetNumber);

printf("Please enter the contact's street name: ");
scanf(" %41s", address.street);

printf("Do you want to enter an apartment number? (y or n): ");
scanf(" %c", &option);

if (option == 'y' || option == 'Y')
{
    printf("Please enter the contact's apartment number: ");
    scanf(" %d", &address.apartmentNumber);
}

printf("Please enter the contact's postal code: ");
scanf(" %8s", address.postalCode);

printf("Please enter the contact's city: ");
scanf(" %41s", address.city);

// Contact Numbers Input:
printf("Do you want to enter a cell phone number? (y or n): ");
scanf(" %c", &option);

if (option == 'y' || option == 'Y')
{
    printf("Please enter the contact's cell phone number: ");
    scanf(" %11s", numbers.cell);
}

printf("Do you want to enter a home phone number? (y or n): ");
scanf(" %c", &option);

if (option == 'y' || option == 'Y')
{
    printf("Please enter the contact's home phone number: ");
    scanf(" %11s", numbers.home);
}

printf("Do you want to enter a business phone number? (y or n): ");
scanf(" %c", &option);

if (option == 'y' || option == 'Y')
{
    printf("Please enter the contact's business phone number: ");
    scanf(" %11s", numbers.business);
}

Вот вывод

1 Ответ

0 голосов
/ 09 марта 2020

Проблема с вашим кодом в том, что scanf имеет тенденцию оставлять символ новой строки, по крайней мере, в зависимости от вашего ввода, в буфере stdin, поэтому при следующем чтении эти непрочитанные символы будут считываться и путаться в последовательности событий. вам нужно для вашей программы. " %c" является хорошим решением для одного символа, но может быть не столь эффективным для вас "%ns" входных данных.

Вам нужно будет отказаться от этих дополнительных символов, есть несколько способов сделать это, в основном, очищайте ввод после каждого чтения, я советую использовать простую функцию:

void clear_buff(){
    int c;
    while ((c = getchar()) != '\n' && c != EOF){}
}

Запуск его после каждого сканирования.

//...
scanf("%11s", numbers.home);
clear_buff();
//...

Вы также можете рассмотреть возможность использования более безопасных методов ввода, таких как fscanf или fgets.

Например, в scanf("%41s", address.city);, scanf прекратит чтение, когда найдет пробел, город с именем, состоящим из двух слов, не будет работать, будет прочитано только первое имя, вы можете исправить это с fgets(address.city, sizeof(address.city, stdin).

...