Проблема с вашим кодом в том, что 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)
.