2015-11-26 6 views
0

Я новичок в C.В C, strtok вызывает ошибку сегментации

Я пытаюсь устранить ".,;?!" из строки с использованием strtok, а затем для создания простой строки без каких-либо знаков препинания, но после компиляции она дает мне «ошибку сегментации». Почему и как это исправить?

char simple_s[100]; 
char delim[20]; 
memset(simple_s,0,100); 
memset(delim,0,100); 
strcpy(delim,strtok(s,",.;:!? ")); 
while(delim != NULL) { 
    strcat(simple_s,delim); 
    strcpy(delim,strtok(NULL,",.;:!? ")); 
} 
printf("%s",simple_s); 
+3

'char delim [20];' follow 'memset (delim, 0,100);' нехорошо! – pedwards

+0

'strcpy (delim, strtok (s,",.;:!? "));' * Before * вы проверяете 'delim' для' NULL', это не хорошо! –

+0

Я удалил его, но ошибка сохранилась. –

ответ

0

delim должен быть определен как символ *. Вот ваш код с парой исправленных ошибок:

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

int main(int argc, char **argv) 
{ 
    char s[100]; 
    char simple_s[100]; 
    char *delim; 
    strcpy(s, "abc,def"); 
    memset(simple_s,0,sizeof(simple_s)); 
    delim = strtok(s,",.;:!? "); 
    while(delim != NULL) { 
    strcat(simple_s,delim); 
    delim = strtok(NULL,",.;:!? "); 
    } 
    printf("%s",simple_s); 
    return 0; 
} 

Это выводит abcdef

1

Есть несколько ошибок в коде. Сначала вы обнулить слишком много байтов с

char delim[20]; 
memset(delim,0,100); 

Чтобы избежать этой ошибки, вы должны использовать

char simple_s[100]; 
char delim[20]; 
memset(simple_s,0,sizeof(simple_s)); 
memset(delim,0,sizeof(delim)); 

Далее, вы использовали возвращаемое значение strtok() перед проверкой, если она NULL

strcpy(delim,strtok(s,",.;:!? ")); 

и оттуда вы переходите к тестированию delim за то, что он NULL вместо проверки указателя NULL от strtok()

while(delim != NULL) { 
    strcat(simple_s,delim); 
    strcpy(delim,strtok(NULL,",.;:!? "));  // <--- copying from NULL pointer 
} 

но delim даже не является необходимым, вам нужно работать с указателем, возвращенного strtok(). Объединив это, я бы получил

char simple_s[100] = "";      // initialise string 
char seps[] = ",.;:!? ";      // added separators, so not to duplicate 
char *tok;          // added to receive value from strtok() 
tok = strtok(s, seps); 
while(tok) {         // until `NULL` returned 
    strcat(simple_s, tok); 
    tok = strtok(NULL, seps); 
} 
printf("%s",simple_s); 

Кроме того, я пропустил проверку длины строки. Когда у вас есть работа, убедитесь, что новая длина simple_s[] не сломается, перед вами strcat() следующая подстрока.

+0

Спасибо, за ваше время и за разъяснения. Теперь я понимаю свои ошибки. –

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