2012-03-19 2 views
0

Попытка взять несколько имен файлов у пользователя в командной строке и сохранить их в связанном списке, но я получаю ошибку сегментации. Идея состоит в том, чтобы пользователь вводил каждое имя файла, а затем вводил «q», когда они были закончены.Назначение нового значения для строки - C

Я ввожу первое имя файла "man_on_moon.txt" и никаких ошибок не возникает. После ввода второго «sat_moons_rings.txt» я получаю .. Ошибка сегментации: 11 Я считаю, что это происходит в моем назначении char * name, но я не уверен.

char *name = malloc(sizeof(char) *50); 
scanf("%s", name); 
list *curr, *head; 
curr = malloc(sizeof(list)); 
head = malloc(sizeof(head)); 
if(name != "q") 
{ 
    curr->item = name; 
    head->next = curr; 
    curr = curr->next; 
    scanf("%s", name); 
} 
while(name != "q") 
{ 
    curr->item = name; 
    curr = curr->next; 
    scanf("%s", name); 
} 
+1

Вы выделяете только одну строку. Каждый раз, когда вы выполняете 'scanf («% s », name)', вы будете перезаписывать одни и те же строковые данные. –

+1

Эта строка немного рыбная: «' head = malloc (sizeof (head)); '' Может быть, просто опечатка, но 'head' и' curr' являются указателями того же типа, но им назначаются блоки разного размера ... –

ответ

3

Вы никогда не заходило curr->next ни к чему, так что это указывает на то NULLcurr вы установите на curr->next. Поэтому, когда вы попадаете в цикл while, вы получаете доступ к curr->item, вы пытаетесь получить поля NULL, и вы получите segfault.

Причина этого заключается в том, что вы всего лишь mallocing space для 2 узлов. У вас есть пространство malloc для каждого узла, который вы делаете.

+0

Отлично, я выделил память для каждого текущего текущего события, и программа принимает несколько имен файлов. Спасибо. Однако он не выходит из цикла while, когда я ввожу q в командную строку. Предложения? – user1201114

+0

не использовать '! =' Use 'strcmp (name," q ")! = 0'. – twain249

+0

Отлично, спасибо, еще раз !!! Береги себя! – user1201114

1

Вы должны ограничить строку Scanf поэтому он не может переполнить ваш буфер:

scanf("%49s", Name); 

Затем сравнить конец вашего цикла вы должны проверить с характером - не сравнение строк:

if (name[0] != 'q') 

..

Наконец, вам нужно скопировать ваше имя в свой список.

+0

вы не должны использовать 'if (name [0]! = 'Q')', потому что это будет ломаться для любой строки, начинающейся с 'q', а также строки «q» – twain249

+0

О да, конечно. Написал этот ответ слишком быстро. Он должен иметь значение strlen (name) == 1 или просто strcmp(), как вы упомянули. – peterept

Смежные вопросы