scanf ("% [^ \ n] s") отлично работает с нормальной переменной, но не работает со структурной переменной в C - PullRequest
0 голосов
/ 23 июня 2018

Я использую компилятор GCC

Я также хотел отсканировать белый символ, поэтому я использовал scanf("%[^\n]s",&name), и он просто отлично работал.

говорят, что код

void main(){
    char name[20];
    scanf("%[^\n]s",&name);
    printf("%s",name);
}

но когда я попытался использовать его со структурной переменной, оператор больше не работает.

struct book { char name[20];};
main(){
    struct book buk[10];
    int i;
    for(i=0;i<3;i++)
    {
        printf("Enter name of book %d",i+1);
        scanf("%[^\n]s",&buk[i].name);}
    }

Оператор scanf просто не выполняется.

Но если я использую простой scanf("%s",&name); работает просто отлично.Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 23 июня 2018

Я использовал 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().

...