Проблемы со scanf и строками в цикле while

Я не понимаю, что не так с этой частью кода моей программы. Я использую цикл while, чтобы попросить пользователя вставить строку, которая будет сохранена во временную строку (char *name), а затем передана в качестве аргумента функции. Однако проблема в том, что я использую функцию scanf. Это код:

char *name;
size_t i=0;

while(i<size){
    printf("Insert #%zu item name: ",i+1);
    scanf("%s",name);
    printf("Insert #%zu item price: ",i+1);
    scanf("%u",&price);
    item=item_cons(item,name,price);
    i++;
}

person Gio    schedule 21.06.2016    source источник
comment
However the problem is when I use scanf function что это?   -  person Sourav Ghosh    schedule 22.06.2016
comment
О, извините, я забыл вставить это. Хорошо, вот в чем проблема: когда я вставляю строку, она печатается для (размер) раз, вставляет имя элемента 1-2-3-4-...-size и вставляет цену элемента 1..size.   -  person Gio    schedule 22.06.2016


Ответы (2)


В вашем коде

scanf("%s",name);

вы не выделили память для name, указателя. Он указывает на недопустимое место в памяти, и попытка использовать его для хранения любого значения вызовет undefined поведение.

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

  • создать name массив, например char name[32] = {0};, а затем использовать его как scanf("%31s",name); (обычно предпочтительнее)

or,

  • выделить динамическую память для char *name, используя malloc() или семейство.
person Sourav Ghosh    schedule 21.06.2016
comment
Я использовал name=malloc(sizeof(char*)*size); и это работает Спасибо! - person Gio; 22.06.2016
comment
@Gio Нет, это не похоже, скорее, вы можете захотеть name= malloc( sizeof(*name) * size); Примечание: 1) Вам нужно проверить успешность malloc() 2) После этого вам нужно освободить память. В чем проблема с массивом? - person Sourav Ghosh; 22.06.2016
comment
Подождите, только потому, что это работает, не означает, что это правильно. name=malloc(sizeof(char*)*size); неверно, так как вы хотите выделить память для chars, а не char *s... см. мой предыдущий комментарий ^. - person Sourav Ghosh; 22.06.2016
comment
Проще говоря, name не имеет инициализации - его содержимое не указано. C не указывает name на недопустимую ячейку памяти. - person chux - Reinstate Monica; 22.06.2016
comment
Кстати: попытка использовать (путем разыменования) для сохранения любого значения приведет к неопределенному поведению. верно, и несколько удивительно, что даже чтение значения pointer равно UB. - person chux - Reinstate Monica; 22.06.2016

попробуйте использовать char name[100]={'\0'} это предполагает, что большее имя, которое вы получите, равно 10

person Ameer Aamar    schedule 22.06.2016
comment
Добавьте некоторое объяснение с ответом о том, как этот ответ помогает ОП в устранении текущей проблемы. - person ρяσѕρєя K; 22.06.2016