0

strtokを使用して、cstringに読み込まれた行を個々の文字列にスプライスしようとしています。はい、文字列オブジェクトを使用するとこれをはるかに簡単に実行できることはわかっていますが、使用することは許可されていません。このコードを実行すると、最初の行で完全に機能し、ループのすべての反復で同じ行でのみ機能し続けます。cout << line << endl;で証明されているように、ファイルは検証可能な'line'char配列に正常に読み込まれています。ただし、strtokと2番目のwhileループは、毎回読み取られる最初の行を分割し続けます。各行には、first_namelast_nameIDと6つのグレードが含まれています。私はそれを書き直し、空白でgetlineを区切り、個々の文字列を読み取ると思いますが、strtokがループの連続する各反復で最初の文字列のみをスプライスしている理由を誰かが知っていますか?

これはコードセグメントであり、すべての変数が他の場所で正しく宣言されていると想定します

 while(!fin.eof())
    {//while open
    fin.getline(line, 40, '\n');
    cout << line << endl;
    ptr = strtok (line, " ");

    while(ptr != NULL)
        {
        if(c==0)
          sprintf(firstname, "%s", ptr);
        if(c==1)
          sprintf(lastname, "%s", ptr);
        if(c==2)
          sprintf(id, "%s", ptr);
        if(c==3)
          sprintf(grade1, "%s", ptr);
        if(c==4)
          sprintf(grade2, "%s", ptr);
        if(c==5)
          sprintf(grade3, "%s", ptr);
        if(c==6)
          sprintf(grade4, "%s", ptr);
        if(c==7)
          sprintf(grade5, "%s", ptr);
        if(c==8)
          sprintf(grade6, "%s", ptr);
        ptr = strtok (NULL, " ");
        if(ptr == NULL)
          break;
        c++;
        }
}
4

2 に答える 2

2

c内部ループを離れた後は、変数をリセットしません。

于 2013-02-13T08:11:56.750 に答える
0

@Joachim Pileborgとして、主要な問題はリセットされcます。内部ループに入る前に初期化し、最後を除いてそれぞれc=0;に追加する方がより明示的である可能性があります。elseif

于 2013-02-13T08:23:05.367 に答える