0

楽しみのために、ユーザーが入力した文字列 (または場合によってはテキスト ドキュメント) を取得し、文字列内の単語をスクランブルするプログラムを作成しています。

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ことが正しい方法であると疑い始めています。

4

2 に答える 2

2

無料で提案されているように、文字列がmallocされている場合。次に、それを新しいバッファーにコピーする必要はありません (これは 1 文字短すぎます)。提供されたバッファーを使用します。

複製する必要があるconst char *のは、バッファの内容を変更することを許可されていない人から提供された場合のみです。

strtok_rレギュラーstrtokは再入可能ではないため、使用することもお勧めします。

于 2013-02-08T16:14:07.857 に答える
0

scanf()の代わりに使用できますgetstr()strtok()

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

ユーザーは入力文字を停止する必要があります

  • EOF = CTRL+ D(Linux の場合)

  • EOF = CTRL+ Z(Windows の場合)

于 2013-02-08T16:12:00.010 に答える