2013-04-10 2 views
0

Я написал функцию C, чтобы взять char * в качестве входа и разделить его, используя пробел и сохранить токены снова в массиве строк.Функция выполняет, но дает ошибку сегментации, C

Мой код выполняется должным образом, но прежде чем он завершит выполнение, он выдает сообщение об ошибке сегментации. Может ли кто-нибудь показать мне, что не так.

void parseCommand(char *msg) 
{  
    char buffer[25][30]; 
    char *tok; 
    char *msgCopy; 
    //strcpy(msgCopy,msg); 
    msgCopy =msg; 
    tok = strtok(msgCopy," "); 
    strcpy(buffer[0],tok); 
    int i=1; 
    while(tok != NULL){ 

     tok = strtok (NULL, " "); 
     strcpy(buffer[i],tok); //me line eke error eka 
     printf("%d : %s\n",i,buffer[i]); 
     i++; 
    } 
} 
+0

Вы не указали вход, который приводит к сбою. Я думаю, вы просто переполняете «буфер» слишком длинными строками. – Netch

ответ

3

strtok, наконец, возвращается NULL сигнализировать, что нет больше жетонов, и вы называете strcpy(buffer[i],tok);, которая пытается читать из NULL. Это вызывает segfault.

Вы можете решить путем перемещения strtok в условие цикла:

while((tok = strtok (NULL, " ")) != NULL){ 
    strcpy... 

или избежать петли, используя break заявление:

while(1){ 
    tok = strtok (NULL, " "); 
    if(tok == NULL) break; 
    strcpy... 
+0

Обратите внимание, что этого можно было бы избежать с помощью sanitized 'for (tok = strtok (msgCopy," "); tok; tok = strtok (NULL," ")) {}' loop. (или даже лучше: избегать strtok() alltogether и использовать strchr() или strspn()/strcspn()) – wildplasser

+0

О, теперь я понимаю. Спасибо что подметил это. –

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