Стрток и Стркат конфликт - PullRequest
       23

Стрток и Стркат конфликт

1 голос
/ 14 сентября 2011

Я пытаюсь работать со 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 всегда отсутствует. Кто-нибудь знает как это исправить?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

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

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

Затем вы вызываете strcat: «12 \ 0 \ 03/4/5/6», поэтому указатель вашего токена [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);
}
0 голосов
/ 14 сентября 2011

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

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

...