2015-05-08 3 views
2

Я пытаюсь получить строку ввода, используя scanf() в функции, но она продолжает терпеть неудачу, и я не знаю почему.Сканирование ввода строки продолжает сбой

Это часть моего кода.

typedef struct node {   
    int id; 
    char * name; 
    char * address; 
    char * group;  
    struct node * next; 
} data; 

void showG(data * head) { 
    char * n = ""; 
    int i = 0; 
    data * current = head; 
    scanf("%s", n); 
    printf("The group of %s is\n", n); 

    while (current != NULL) { 
     if (0 == strcmp(current->group, n)) { 
      printf("%d,%s,%s\n", current->id, current->name, current->address); 
      i = 1; 
     } 

     current = current->next; 
    } 
    if (0 == i) { 
     printf("no group found"); 
    } 
} 
+0

Извините, это .. если я изменяю n на «1» и удаляю предложение scanf, другая часть будет работать, что означает, что он будет печатать f «Группа 1 есть .....», но если я держу scanf и запускаю программу, он остановится, когда я хочу ввести значение, чтобы изменить значение n – YoarkYANG

ответ

5

В коде

char * n = ""; 

делает n точку к строкового литерала который обычно помещается в области только для чтения памяти, поэтому не может быть изменен. Следовательно, n не может использоваться для сканирование другой вход. То, что вы хотите, либо из ниже

  • char массив, как

    char n[128] = {0}; 
    
  • указатель char с правильным распределением памяти.

    char * n = malloc(128); 
    

    Пожалуйста, обратите внимание, что если вы используете malloc(), после того, как использование n закончится, вам нужно free() память тоже, чтобы избежать утечки памяти.

Примечание: после закрепления выше проблемы измените

scanf("%s", n); 

в

scanf("%127s", n); 

если распределение для 128 байт, чтобы избежать переполнения памяти.

+0

. Я хочу второй – YoarkYANG

+0

@unwind спасибо, сэр за исправление, так или иначе я его не замечал. :-) –

+0

@JosephYANG затем возьмите второй. :-) –

Смежные вопросы