1

ユーザーが「print 1 2」や「open file1」などのコマンドを入力する小さなプログラムを作成しています。ユーザーがやりたいことを処理するために、を使用してすべてのスペースでユーザー入力を分割しようとしていますstrtok。私の問題は、次のコードの場合です。

void tokenize(char string[100],char tokenized[10][MAX_CHARS]){
    char delims[] = " ";        /*Delimitere is a space so tokenize when a space occurs*/
    char *result = NULL;
    int count = 0;
    result=strtok(string,delims);   /*Tokenize the string*/
    while(result!=NULL && count<10){
        tokenized[count++][MAX_CHARS] = result;  /* This is where I get the error */
        result= strtok(NULL,delims);
    }
}

次のエラーが表示されます。

stringapi.c: In function ‘tokenize’:
stringapi.c:33:33: warning: assignment makes integer from pointer without a cast [enabled by default]

私はしばらくこの問題を解決しようとしてきましたが、うまくいきませんでした。
試しtokenized[count++] = result;ましたが、次のエラーが表示されます。

stringapi.c:33:22: error: incompatible types when assigning to type ‘char[80]’ from type ‘char *’

私の最終的な目標は、ユーザーが「open newfile.txt」と入力した場合に、 array[0]開いている配列array[1]と newfile.txt が必要であり、それに応じて処理できるようにすることです。

4

3 に答える 3

5

次の行:

tokenized[count++] = result;

文字の配列に割り当てようとします。あなたはそれを行うことはできません、あなたは使用する必要がありますstrncpy():

strncpy(tokenized[count++], result, MAX_CHARS);

最後に、私はあなたが好むことをお勧めしstrtok_r()ますstrtok().

于 2012-06-17T11:06:44.340 に答える
0

文字列をコピーするにはstrcpy(またはそれ以上)を使用する必要があります。strncpyそれ以外の場合は、ポインターを配列に割り当てるだけです。

于 2012-06-17T11:08:16.770 に答える
0

あなたは2つのアプローチを混同しています。1 つのアプローチは、入力文字列のすべてを解析済みバージョンの別の場所にコピーする方法です。1 つのアプローチは、解析されたバージョンが、元の入力文字列メモリを保持していたメモリへの一連のポインタである場合です。そのtokenized[...] = result行は 2 番目のアプローチを試みています。使用しているデータ構造は、最初のアプローチを示しています。

最初のアプローチを使用する場合は、トークン化されたものに割り当てるだけでなく、strncpy を実行します。2 番目の方法を使用する場合は、tokenized を char* の配列に変更します。

価値があるため、最初のアプローチをお勧めします。

于 2012-06-17T11:09:22.897 に答える