2012-11-03 3 views
0

Можно создать дубликат:
strtok giving Segmentation Faultstrtok() - Сегментация Fault

Я пытаюсь использовать функцию strtok для разделения строки во многих лексем, но в этом примере он возвращает мне SEG. ошибка ошибки. Где я ошибаюсь?

#include <stdio.h> 
#include <string.h> 

int main(int argc, char** argv){ 
    int i=0; 
    char * string = "HI:HOW:ARE:YOU:?", *tmp; 

    while(1){ 
     if(i==0) tmp=strtok(string,":"); 
     else tmp=strtok(NULL,":"); 
     if(tmp==NULL) break; 
     printf("%s\n",tmp); 
     i++; 
    } 
    return 1; 
} 
+0

'strtok' изменяет переданную ему строку, и вы передаете ей строковый литерал. –

+0

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

ответ

3

Изменить

char * string = "HI:HOW:ARE:YOU:?" 

для

char string [] = "HI:HOW:ARE:YOU:?" 

С символьной строкой [] у вас есть массив, и символ * у вас есть указатель. Когда вы объявляете массив, он запрашивает пространство для выделения размера вашей строки. Строка char * создает указатель, который указывает на литеральную строку.

Проблемы с символом * строкой это то, что точка не должна быть изменена, поскольку строковые литералы обычно хранится в памяти только для чтения, тем самого вызывая undefined behavior 33

(более подробно прочитать эту https://www.securecoding.cert.org/confluence/display/seccode/STR30-C.+Do+not+attempt+to+modify+string+literals)

Следовательно, поскольку с strtok содержимое строки изменено и разбито на более мелкие строки (жетоны), у вас возникли проблемы.

+0

Да, это решение, но, пожалуйста, объясните, почему это так. –

+0

@ H2CO3 Это из-за этого права? – dreamcrash

+0

почти, вторая часть технически правильная, хотя теоретическая причина этого - неопределенное поведение; также это не связано с вопросом об указателе и массиве. –

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