#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);