Я использовал scanf("%[^\n]s",&name)
, и он просто работал нормально? Нет, он не работает нормально.Прочтите справочную страницу scanf()
, там написано
int scanf (const char * format, ...);
первый аргумент имеет тип char*
, но&name
не относится к типу char*
.
Это
char name[20];
scanf("%[^\n]s",&name);
Должно быть
scanf("%[^\n]",name);/* & is not needed as name itself address */
Также должно быть просто "%[^\n]"
, а не "%[^\n]s"
.Правильным является
scanf(" %19[^\n]",name); /* giving space before % prevents reading extra characters */
Также лучше использовать fgets()
.Например,
char *p = fgets(buk[i].name),sizeof(buk[i].name),stdin);
if(p != NULL) {
/* do some stuff */
}
Примечание: если вы используете fgets()
, вам следует помнить о том, что fgets()
хранит \n
в конце буфера.поэтому вы можете заменить \n
на \0
, для этого вы можете использовать strcspn()
или сделать это вручную.
Редактировать: Обратите внимание, что поток stdin
является строкойбуферизуется, т. е. после scanf("%[^\n]",name);
символ новой строки \n
остается в потоке stdin
, и если вы сканируете данные снова во второй раз, он может потерпеть неудачу, не сохранив ничего в name
, и может вызвать неопределенное поведение.Поэтому прежде всего проверьте возвращаемое значение scanf()
.