1

fgets を使用してファイルから次の行を読み込んでいます。

#C one two three four five six seven eight nine ten eleven

各単語 (#C を除く) は列見出しです。したがって、私のファイルには 11 列あります。

私の目的は、この行を各単語のトークンに分割することです。また、列見出しが 11 個あることを数える必要があります。(列見出しは 11 より多い場合も少ない場合もあります)

私の問題は、この行の最後のスペースにあります。ここに私が使用しているコードがあります:

while(1){
fgets(buffer,1024,filename);
if (buffer[1] == 'C'){
    char* str = buffer+2;
    char* pch;
    pch = strtok(str," ");
    while(pch != NULL){
        pch = strtok (NULL, " ");
        if (pch == NULL)break; //without this, ncol contains +1 the 
                               //amount of columns.
            ncol++;
    }
    break;
}
}

このコードは私に ncol = 11 を与えます.そしてうまく動作します.(私が読んでいる行の最後に単一のスペースがあることに注意してください)

ただし、行末にスペースがない場合は、ncol = 10 となり、最後の列は読み取られません。

私の目的は、 not の最後にスペースがあるかどうかに関係なく、 ncol =11 を取得することです。最後の単語を読みたいだけで、他に単語があるかどうかを確認し、ない場合は終了します。

4

4 に答える 4

0

このループを変更すると:

while(pch != NULL){
    pch = strtok (NULL, " ");
    if (pch == NULL)break; //without this, ncol contains +1 the 
                           //amount of columns.
        ncol++;
}

に:

while(pch != NULL){
    char *keep = pch;
    pch = strtok (NULL, " ");
    if (pch == NULL)
    {
       if (strlen(keep)) 
       {
           ncol++;
       }
       break; //without this, ncol contains +1 the 
    }
    //amount of columns.
    ncol++;
}

したがって、文字列に何かが残っている場合、 whenpchが NULL の場合、別の文字列があるためncol、if でインクリメントします。[入力ファイルが「整形式」でない場合は、if (strlen(keep))より徹底的にする必要があることに気付くかもしれませんが、私はあなたの入力が「良い」と仮定しています]

于 2013-05-02T14:48:07.450 に答える