У вас есть пара проблем.
Как указал @sander, вы ничего не делаете для очистки новой строки из буфера ввода.
Вы также использовали %[^\n]s
- но s
не требуется (и не является частью) преобразования набора сканирования. Так как он не является частью преобразования, scanf пытается сопоставить этот символ на входе - но, поскольку вы только что прочитали до новой строки (и не прочитали саму новую строку), он более или менее требует, чтобы 's' = = '\ n' - что, очевидно, не может быть, поэтому сканирование не выполняется.
Чтобы сделать это, вы можете использовать что-то вроде этого:
scanf("%49[^\n]%*c", name);
scanf("%99[^\n]%*c", address);
Относительно того, почему вы хотите использовать это вместо fgets
, одна очевидная причина состоит в том, что он не включает в себя завершающий (и редко желаемый) символ новой строки, когда все работает правильно. fgets
Сохранение новой строки дает вам один результат, который может быть полезен: новая строка присутствует тогда и только тогда, когда все содержимое строки было прочитано. Если вы действительно обеспокоены этим (например, вы хотите изменить размер буфера и продолжить чтение, если имя превышает указанный размер), вы можете получить то же самое с scanf
- вместо использования %*c
для второго преобразования, используйте %c
и передайте адрес char
. Вы читаете всю строку в том и только в том случае, если впоследствии прочитали новую строку в этот символ.