-1
 void readit(FILE* filePtr, int* num1, int* num2, char** strings, int lines)
     {
int t;
char line[50];

for (t = 0; t < lines; t++){
    fgets(line, 50, filePtr);
    *(strings + t) = strtok(line, " "));
    *(num2 + t) = atoi(strtok(NULL, " "));
    *(num2 + t) = atoi(strtok(NULL, " "));
}

このコードでは、*strings 部分が意図したとおりに機能していません。コードを通過するたびに、文字列配列全体が上書きされます。fgets は正しいデータを読み込んでおり、最初のトークンの値を出力すると、すべてのループが期待どおりになります。ループの外側 (または i print (i - 1) の場合は内側) すべての配列 *str + 1、*str + 2 など。最後のパススルーの値が含まれます。

例えば。

         *(strings + 0) = "Hi";
         printf("%s", *(strings + 0)); //Will print hi

         //next iteration
         *(strings + 1) = "You";
         printf("%s", *(strings + 1)); // will print you
         printf("%s", *(strings + 0)); // will print you as well
4

1 に答える 1

2

問題は、常に上書きされる文字列バッファーが 1 つしかないことです。新しいメモリを割り当てないことを忘れstrtokないでください。渡されたバッファにポインタを返します。strtokループセットを通過するたびに*(strings + t) = line。次に、次のループで日付を上書きしますline。最終的には、すべて同じ文字列バッファーを指す char ポインターの配列になります。(未定義の動作であるローカル変数へのポインタも返しています)

コードは次と同等です。

    char *strings[2];
    char line[50];
    strcpy(line, "Hi");
    *(strings + 0) = line;
     printf("%s", *(strings + 0)); //Will print hi

     //next iteration
     strcpy(line, "You");
     *(strings + 1) = line;
     printf("%s", *(strings + 1)); // will print you
     printf("%s", *(strings + 0)); // will print you as well

したがって、両方strings+0string+1ポイントはもちろん、印刷lineされる内容を変更して行を上書きします。strings+0

メモリを動的に割り当てるか、アクセスできるバッファをベースにする必要がありますstrcpy。例えば:

char strings[5][50];
readit(filtPtr, &num1, &num2, strings, 50);

...

void readit(FILE* filePtr, int* num1, int* num2, char** strings, int lines)
{
     int t;
     char line[50];

    for (t = 0; t < lines; t++){
        fgets(line, 50, filePtr);
        strcpy(*(strings + t), strtok(line, " ")));
        *(num2 + t) = atoi(strtok(NULL, " "));
        *(num2 + t) = atoi(strtok(NULL, " "));
    }
}
于 2013-02-18T03:59:02.293 に答える