Scanf пропускает функции - PullRequest
1 голос
/ 11 марта 2019

Я работаю над своим заданием, и я столкнулся с этой проблемой. В присваивании говорится, что входное значение для средних инициалов должно быть таким - «Л. А.». Однако, когда я запускаю свою программу, она печатает некоторые функции printf в той же строке, пропуская функцию scanf. Я прошел много тем об этой проблеме "% c", но я все еще не могу заставить мою программу работать должным образом. Некоторые из переменных взяты из файла .h. Фактическое задание больше, но оно в значительной степени повторяется, поэтому я подумал, что если я пойму, как решить эту проблему, я смогу наконец закончить свое задание.

int main(void){


    // Declare variables here:

    char ch;

    struct Name FullName = { {'\0'} };

    struct Address AddressInfo = { 0, '\0', 0, '\0', '\0' };

    struct Numbers PhoneInfo = { {'\0'} };

    // Display the title

    printf("Contact Management System\n");
    printf("-------------------------\n");

    // Contact Name Input:

    printf("Please enter the contact’s first name: ");
    scanf("%s", &FullName.firstName);

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

    if (ch == 'y') {
        printf("Please enter the contact’s middle initial(s): ");
        scanf(" %s", FullName.middleInitial);
    }


    printf("Please enter the contact’s last name: ");
    scanf(" %s", &FullName.lastName);


    // Contact Address Input:

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

ВЫХОД (Я выделил входные значения):

Contact Management System
-------------------------
Please enter the contactÆs first name: *Artem*
Do you want to enter a middle initial(s)? (y or n): *y*
Please enter the contactÆs middle initial(s): *L. A.*
Please enter the contactÆs last name: Please enter the contactÆs street number:

1 Ответ

1 голос
/ 11 марта 2019

Спецификатор формата %s читает последовательность символов, оканчивающуюся пробелом.Когда вы вводите L. A., только L. считывается в middleInitial, потому что оно останавливает чтение в пробеле и A. остается во входном буфере.На следующем scanf он сразу читает эти буферизованные символы, поэтому он не останавливается, ничего не запрашивая.

Самый простой способ справиться с этим - не использовать пробел при вводе, то есть L.A..Если вы хотите поддерживать пробельные символы, вам нужно полностью избавиться от scanf и прочитать всю строку целиком за один раз, используя fgets.Обратите внимание, что fgets также читает в конце новой строки, так что вам нужно удалить это.

...