2016-03-28 3 views
0

Здравствуйте, я пытаюсь удалить первое слово в строке. Например: buffer = "Hello my name is Code" После внедрения removeToken() буфер должен быть "my name is Code".Удаление первого слова в строке в C

Код, который у меня есть, дает мне ошибку сегментации.

У меня есть следующие:

char *buffer = NULL; 
char *buffercopy = NULL; 

void startBuffer(char *inputLine) { 
    int length = strlen(inputLine); 
    buffer = (char *)malloc(length); 
    buffercopy = (char *)malloc(length); 
    strcpy(buffer, inputLine); 
    strcpy(buffercopy, inputLine); 
} 

char *removeToken() { 
    /* removes the first token from the buffer, buffer is reduced in size */ 
    char *token; 
    char delimiters[2] = " ,"; 
    int origLen = strlen(buffer); 
    token = strtok(buffer, delimiters); 
    printf("%s \n", token); 
    int p = strlen(token); 
    int i = 0; 
    while (buffer[i] != '\0') { 
     buffer[i] = buffer[i + p]; 
     i++; 
    } 
    return buffer; 
} 
+0

вы пробовали пошаговый код самостоятельно с помощью отладчика? Вы знаете, где происходит segfault? –

+0

Да! он возникает в цикле while, начиная с «while (buffer [i]! = ....» – jobravooo

ответ

1

Есть несколько проблем в коде:

не выделить достаточно памяти для копирования строк, необходимо выделить один дополнительный байт для нулевого терминатора:

void startBuffer(char *inputLine) { 
    int length = strlen(inputLine); 
    buffer = (char *)malloc(length + 1); 
    buffercopy = (char *)malloc(length + 1); 
    strcpy(buffer, inputLine); 
    strcpy(buffercopy, inputLine); 
} 

следует отметить, что приведенный выше код может быть упрощено к этому:

void startBuffer(const char *inputLine) { 
    buffer = strdup(inputline); 
    buffercopy = strdup(inputline); 
} 

В removeToken, вы выделяете строку разделителя с:

char delimiters[2] = " ,"; 

Это неверно, как вам нужно третьи байты для '\0' нулевого терминатора. Вы можете написать вместо этого:

char delimiters[] = " ,"; 

Вы только посчитайте длину исходной строки, а не разделители, первая из которых была изменена на '\0'.

Цикл копирования поэтому останавливается немедленно.

Вы также забудете скопировать окончательный '\0' в цикл копирования.

Вот исправленный вариант:

char *removeToken(char *buffer) { 
    const char *delimiters = " ,"; 
    size_t i, skip; 

    skip = strcspn(buffer, delimiters); /* skip the word */ 
    skip += strspn(buffer + skip, delimiters); /* skip the delimiters */ 

    for (i = 0; buffer[skip + i] != '\0'; i++) { 
     buffer[i] = buffer[skip + i]; 
    } 
    buffer[i] = '\0'; 

    return buffer; 
} 
+0

Большое вам спасибо, кстати, это сработало для меня! В этой строке: skip + = strspn (buffer + skip, разделители);/* пропустить разделители */Я не понимаю, почему вы добавляете буфер и пропускаете – jobravooo

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