Программа, выдающая ошибку шины при чтении с помощью программы scanf — C

#c #error-handling #scanf

Вопрос:

Я пишу программу для базы данных сотрудников и пишу функцию для добавления сотрудника. Я получаю сообщение об ошибке шины после последнего запроса на ввод информации. Я почти уверен, что это связано с моим заявлением scanf, так как сразу после этого у меня есть заявление о печати, которое не печатается. Почему я должен был получить эту ошибку?

Запрос, о котором идет речь, предназначен для чтения в названии должности.

 void addEmployee(void) {  char *name;  char gender;  int age;  char *title;   printf("Enter name: n");   scanf(" 0s", name);   scanf("%*[^n]%*c");   printf("Enter gender: n");  scanf(" ", amp;gender);   scanf("%*[^n]%*c");   printf("Enter age: n");  scanf(" %d", amp;age);   scanf("%*[^n]%*c");   printf("Enter job title: n");  scanf(" 0s", title);   scanf("%*[^n]%*c");   printf("Test");    printf("The employee you've entered is: %s %c %d %s n", name, gender, age, title);   Employee newEmp = {*name, gender, age, *title};    if(employeeList[0] == NULL)  {  employeeList[0] = amp;newEmp;  nodeCount  ;  } }  

Комментарии:

1. На какой объем памяти вы name указываете и title указываете? Что произойдет, когда scanf вы попытаетесь прочитать в памяти, на которую указывают эти указатели?

2. Вы должны выделить место для хранения строк. У вас есть указатели на ничто/мусор

3. имя даже не выделено , вам нужно указать его/вызвать, прежде чем использовать в scanf

4. Не ваша проблема, но: (1) Вам не нужно ведущее место в " 0s" и " %d" . (2) Учитывая , что вы (правильно) используете дополнительное пространство " " , вам не нужны эти scanf("%*[^n]%*c"); строки; они просто сбивают с толку дополнительным шумом.

5. Примечание: scanf("%*[^n]%*c"); не делает ничего полезного, когда следующий символ в stdin есть 'n' . 'n' Останки внутри stdin .

Ответ №1:

Код передается в неинициализированном указателе.

 char *name; // Pointer 'name' not initialize yet. printf("Enter name: n");  // 'name' passed to scanf() is garbage.  scanf(" 0s", name);  

Вместо этого передайте указатель на существующий массив

 char name[100   1]; printf("Enter name: n");  // Here the array 'name' coverts to the address of the first element of the array. // scanf receives a valid pointer. scanf("0s", name);