2013-02-08 4 views
0

Просто для удовольствия я пишу программу, которая возьмет введенную пользователем строку (или, возможно, даже текстовый документ) и скремблирует слова в строке.Cleaner Реализация strtok

Я пытаюсь использовать функцию strtok для разделения каждого слова в строке. На данный момент я чувствую, как моя текущую реализация strtok небрежно:

int main(int argc, char *argv[]) 
{ 
    char *string, *word; 

    if(!(string = getstr()))  //function I wrote to retrieve a string 
    { 
     fputs("Error.\n", stderr); 
     exit(1); 
    } 
    char array[strlen(string) + 1];  //declare an array sized to the length of the string 
    strcpy(array, string);   //copy the string into the array 
    free(string); 
    if(word = strtok(array, " ")) 
    { 
     //later I'll just write each word into a matrix, not important right now. 
     while(word = strtok(NULL, " ")) 
     { 
     //later I'll just write each word into a matrix, not important right now. 
     } 
    } 
    return 0; 
} 

Я чувствую, что должна быть чист способом реализации strtok без объявления массива в середине программы. Мне это просто не кажется правильным. Использует ли strtok правильный путь? Я бы предпочел не использовать массив фиксированного размера, поскольку мне нравится, чтобы все было динамичным, поэтому я начинаю сомневаться в том, что использование strtok - правильный путь.

+0

'free (string);' Почему? Я не вижу никакого 'malloc',' 'getstr()' распределяет память динамически? –

+1

'char array [strlen (string)];' должен быть 'char array [strlen (string) + 1];' –

+0

@AlokSave 'getstr()' распределяет память динамически. @PaulR Я только что обновил его, спасибо. –

ответ

2

Если ваша строка malloced как предложено бесплатное. Тогда вам не нужно копировать его в новый буфер (что слишком короткое 1 бит). Используйте буфер, который вам предоставили.

Вам нужно всего лишь дублировать его, если оно было предоставлено вам const char *, то есть вам не разрешено изменять содержимое буфера.

Также рекомендуется использовать strtok_r, поскольку обычный strtok не является реентерабельным.

+0

Убивает то, что меня контролирует. Вау, спасибо. –

+0

«Также лучше использовать strtok_r, поскольку обычные strtokis не реентерабельны». +1 за этот комментарий. Мне было интересно, хочет ли OP реализовать «настоящий» strtok со всеми своими бородавками (в основном не реентерабельный), или если OP хочет реализовать лучший strtok. –

0

Вы можете использовать scanf() вместо getstr() и strtok()

char word[100]; 
while(scanf(" %s",word)!=EOF) { 
    // use the word string here 
} 

пользователь должен остановить ввод chracters с

  • EOF = CTRL + D (для Linux)

  • EOF = CTRL +Z (для Windows)

+0

Извините, отредактировал мой вопрос, чтобы быть более ясным, я пытаюсь сделать это динамически, я не хочу использовать 'scanf'. –

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