2016-11-29 2 views
0

Я пытаюсь сделать функцию, чтобы разбить предложение на слова и сохранить слова в массив строк. Если я использую глобальную переменную, она работает, строки сохраняются красиво, и задание выполняется, однако, когда я пытаюсь передать массив, определенный в основном, он не будет работать.Хранение токена (strtok) от функции в массиве от основного

void split(char sentence[], char *words[]){ 
    unsigned char n= 0; 
    const char delim n= " "; 
    char clone[strlen(sentence)]; 
    strcpy(clone, sentence); 

    char *token; 
    token= strtok(clone, delim); 

    while(token != NULL){ 
    words[n++]= token; 
    token= strtok(NULL, delim); 
    } 
    words[n]= NULL; //Needed for future usage of the array; 
} 

int main(){ 
    char *sentenceFromMain; 
    sentenceFromMain= "A BB CCC DDDD"; 

    char *wordList[nrOfWords+1]; //I do have another function that counts words 

    split(sentenceFromMain, wordList); 
    exit(0); 
} 

Если я в этой функции, например, words[0]= "A"; это работает. Является ли токен возвратом указателя? Как мне получить только то, что хранится в нем? Я попробовал несколько способов сделать это, никто из них не работал хорошо. Каждый ответ приветствуется!

+0

Вы передаете указатель на строковый литерал *, однако 'strtok' пишет в проверяемую строку, и это незаконно. –

+0

@WeatherVane OP используется _clone_. – BLUEPIXY

+0

'const char delim n =" ";' -> 'const char * delim =" ";' – BLUEPIXY

ответ

0

Проблема заключается в том, что strtok возвращает указатели в строку, которую она символизирует. Указатели, которые вы получите, будут указателями на массив clone, который является локальным внутри функции split. Как только функция split вернет указатели, они больше не будут действительны.

Один из возможных способов решения этой проблемы - не иметь локальный массив clone, но иметь внешнюю внешнюю функцию и передать его в качестве первого аргумента и использовать этот аргумент при вызове strtok.

+0

Это может быть решение, но мне понадобится эта функция несколько раз в моей программе. Должен ли я просто положить клон в основном? Если я это сделаю, как мне переопределить его каждый раз, когда мне нужно его изменить? – Cooble

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