Несколько проблем в вашем коде.Прежде всего вы не должны включать malloc.h
.Это устарело.
Похоже, что существует некоторая путаница в объявлении n,p,id,h,pph
переменных.Это утверждение:
char* n,p,id,h,pph;
объявляет только n
для типа char *
и остальные переменные p,id,h,pph
объявлены для типа char
.
Давайте поговорим о предупрежденияхсообщение от компилятора (я использую gcc
компилятор и предоставляю опции -Wall
и -Wextra
во время компиляции):
$ gcc -Wall -Wextra prg.c
prg.c:56:26: warning: format specifies type 'char *' but the argument has type 'char **' [-Wformat]
scanf("%s", &n);
~~ ^~
prg.c:61:24: warning: incompatible integer to pointer conversion assigning to 'char *' from 'char'; take the address with & [-Wint-conversion]
number[i] = p;
^ ~
&
prg.c:64:23: warning: incompatible integer to pointer conversion assigning to 'char *' from 'char'; take the address with & [-Wint-conversion]
hours[i] = h;
^ ~
&
prg.c:68:21: warning: incompatible integer to pointer conversion assigning to 'char *' from 'char'; take the address with & [-Wint-conversion]
pPH[i] = pph;
^ ~~~
&
prg.c:35:15: warning: unused variable 'id' [-Wunused-variable]
char* n,p,id,h,pph;
^
5 warnings generated.
Не следует игнорировать предупреждающие сообщения компилятора.Они там по какой-то причине.
Предупреждение 1
:
n
относится к типу char *
и, следовательно, &n
относится к типу char **
.Спецификатор формата %s
в scanf()
ожидает аргумент в виде массива, и в массиве должно быть не менее input_size+1
символов.
Вы должны объявить n
как массив символов, что-то вроде этого:
char n[50];
// and for input
scanf("%49s", n);
Предупреждение 2
:
p
относится к типу char
и number[i]
относится к типу char *
.Следовательно, назначение несовместимо.Также &p
имеет тип char *
, поэтому компилятор не сообщает о каком-либо предупреждении о выражении:
scanf("%s", &p);
Но это не правильно, потому что p
имеет тип char
и этоне хватает места для ввода строки.Подробнее о спецификаторах формата scanf()
.
Вы можете сделать:
char p[50];
// and for input
scanf("%49s", p);
number[i] = strdup(p);
Если вы не используете strdup
,все указатели массива number
в конечном итоге указывают на одно и то же место.В качестве альтернативы вы можете объявить p
как char *
и явно обрабатывать операцию выделения / освобождения памяти.Убедитесь, что free
память возвращена strdup
, как только вы закончите с этим.То же самое объяснение для предупреждений 3
и 4
.
Предупреждение 5
:
Удалите неиспользуемые переменные из вашего кода.
В вашем коде есть ряд улучшений.Попробуйте выяснить их самостоятельно.