Zeeking99 Ответов: 2

Получение сведений о работнике и запись их в файл


Я все еще учусь С. Я пытаюсь написать программу, которая запрашивает количество рабочих и назначает память с помощью функции malloc. Я создал структуру, которая хранит сведения о рабочих. Когда я беру данные от пользователя, все работает нормально, пока программа не запросит номер мобильного телефона рабочих, программа перестает работать.

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
	int eid;
	char name[50];
	unsigned int mobilenumber;
} workers;

int main()
{
	int worker;
	
	printf("Enter the number of workers: ");
	scanf("%d", &worker);
	
	workers *ptr;
	ptr = (workers *)malloc( worker * sizeof(workers));
	
	printf("Enter the mobilenumber of the worker: ");
	scanf("%u", ptr->mobilenumber);
	printf("Enter the ID of the worker: ");
	scanf("%d", ptr->eid);
	printf("Enter the name of the worker: ");
	scanf(" %[^\n]", ptr->name);
	
	printf("%d", ptr->eid);
	
	free(ptr);
	return 0;
}


Что я уже пробовал:

Я думаю, что проблема существует из-за функции scanf, но я не могу найти неисправность.

2 Ответов

Рейтинг:
20

OriginalGriff

Здесь есть пара вещей:
1) номер мобильного телефона-это не число в традиционном смысле: это строка, а не целое число. Не веришь мне? Позвоните своему лучшему другу, не используя ведущий ноль ...
Если вы не можете сделать математику с ним, это не число, и не должно храниться как таковое.
(Кроме того, номер мобильного телефона может содержать и другие символы, такие как скобки и плюс.)
Это игнорирует тот факт, что размер целого числа варьируется от системы к системе: на некоторых он может быть только 16 бит, что слишком мало, чтобы продырявить мобильный номер в любом случае.

2) Когда вы это делаете:

ptr->mobilenumber
ты разыменовывать указатель и возвращает значение, содержащееся в целочисленном значении, а не адрес целого числа. Так что когда вы это сделаете:
scanf("%u", ptr->mobilenumber);
вы передаете содержимое переменной в scanf - который либо случайно равен нулю, в зависимости от вашего компилятора и параметров, и он будет рассматривать его как адрес. В этот момент ваше приложение, скорее всего, рухнет или сделает очень странные вещи!
Вам нужно передать адрес целого числа, а не его содержимое:
scanf("%u", &(ptr->mobilenumber));
Он работает для массивов символов, потому что имя массива является указателем на первый элемент самого массива.

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


Zeeking99

Огромное спасибо!. Теперь я понимаю, почему так важно понимать указатели. Спасибо, что указал на мою слабость.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
0

KarstenK

Вы должны использовать и хранить номер мобильного телефона в виде строки. Взгляните на это примеры телефонных номеров.

При сравнении телефонных номеров вам нужна некоторая нормализация, например удаление "()" или работа с "+". А сравнение есть всегда правосторонний.

Работа с телефонными номерами-это искусство. ;-)