Конфликт Strtok и Strcat

Я пытаюсь работать с strtok и strcat, но второй printf никогда не появляется. Вот код:

int i = 0;
char *token[128];
token[i] = strtok(tmp, "/");
printf("%s\n", token[i]);
i++;
while ((token[i] = strtok(NULL, "/")) != NULL) {
    strcat(token[0], token[i]);
    printf("%s", token[i]);
    i++;
}

Если мой ввод 1/2/3/4/5/6 для tmp, то вывод консоли будет 13456. 2 всегда отсутствует. Кто-нибудь знает, как это исправить?


person gFu    schedule 14.09.2011    source источник


Ответы (2)


Два всегда отсутствуют, потому что на первой итерации вашего цикла вы перезаписываете его вызовом strcat.

После входа в цикл ваш буфер содержит: "1\02\03/4/5/6" внутренний указатель strtok указывает на "3". tokens[1] указывает на «2».

Затем вы вызываете strcat: "12\0\03/4/5/6", чтобы ваш указатель token[i] указывал на "\0". Первый отпечаток ничего не печатает.

Последующие вызовы допустимы, поскольку нулевые символы не перезаписывают входные данные.

Чтобы исправить это, вы должны создать свою выходную строку во втором буфере, а не в том, который вы анализируете.

Рабочая(?) версия:

#include <stdio.h>
#include <string.h>
int main(void)
{
    int i = 0;
    char *token[128];
    char tmp[128];
    char removed[128] = {0};
    strcpy(tmp, "1/2/3/4/5/6");
    token[i] = strtok(tmp, "/");
    strcat(removed, token[i]);
    printf("%s\n", token[i]);
    i++;
    while ((token[i] = strtok(NULL, "/")) != NULL) {
        strcat(removed, token[i]);
        printf("%s", token[i]);
        i++;
    }
    return (0);
}
person tinman    schedule 14.09.2011

strtok изменяет входную строку на месте и возвращает указатели на эту строку. Затем вы берете один из этих указателей (token[0]) и передаете его другой операции (strcat), которая выполняет запись в этот указатель. Писатели бьют друг друга.

Если вы хотите объединить все токены, вы должны выделить отдельные char* до strcpy до.

person evil otto    schedule 14.09.2011