Есть несколько ошибок в коде. Сначала вы обнулить слишком много байтов с
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()
следующая подстрока.
'char delim [20];' follow 'memset (delim, 0,100);' нехорошо! – pedwards
'strcpy (delim, strtok (s,",.;:!? "));' * Before * вы проверяете 'delim' для' NULL', это не хорошо! –
Я удалил его, но ошибка сохранилась. –