2

何が間違っているのかわかりません。同様の問題を実行しましたが、数字を読み取ることで機能します。このプログラムが実行するのは、names.txtで読み取られることです。このドキュメントには名前が含まれています(最後、最初)

したがって、テキストには

ワシントン、ジョージ

アダムズ、ジョン

ジェファーソン、トーマスなど...

私のプログラムは名前を読み込みますが、出力が正しくありません。出力は次のとおりです。

ワシントン、ジョージ

WAdams、GJohn

WAJefferson、GJThomas

それで、次の行を読むとき、それは前の名前の最初の文字を保持しますか?

#include <stdio.h>

int main(void)
{

    char first_n[70]; 
    char last_n[70];
    
    int i=0;
    FILE *oput;
    FILE *iput;
    
    iput = fopen( "names.txt","r" );
    while ( fscanf( iput,"%s %s", &last_n[i],&first_n[i] ) !=  EOF )
    {
        i++; 
        printf("%s %s\n",last_n,first_n);
    }
        
    oput=fopen("user_name_info.txt","wt"); //opens output file
    fprintf(oput, "Last\t\tFirst\n------------\t-------------\n%s\t%s\n",last_n,first_n);
    
    return 0;
}

私は何が間違っているのですか?

4

1 に答える 1

2

first_nlast_nは文字の配列です(つまり、単一の文字列だと思います)

あなたfscanfはそれらを文字列の配列であると思うように扱っています。毎回1文字ずつ文字列を読み込んでいます。つまり、最初は文字列をオフセット0に配置し、2回目はオフセット1に配置します。

これを試して:

while ( fscanf( iput,"%s %s", last_n,first_n ) !=  EOF )
{
    i++; 
    printf("%s %s\n",last_n,first_n);
}

最終的な印刷では、最後に読み取った「レコード」のみが印刷されます。おそらくあなたは本当に文字列の配列が欲しかったのでしょうか?これは少しこのように見えます(これが問題を解決するための最良の方法であるとは言いませんが、元のコードの精神に基づいています...)

/* Limited to 20 names of 70 chars each */
char first_names[20][70]; 
char last_names[20][70];

int i=0;
FILE *oput;
FILE *iput;

iput = fopen( "names.txt","r" );
while ( fscanf( iput,"%s %s", &last_names[i],&first_names[i] ) !=  EOF )
{
    printf("%s %s\n",last_names[i],first_names[i]);
    i++;
}

oput=fopen("user_name_info.txt","wt"); //opens output file
i--; /* ensure i points to the last valid data */
while(i >= 0) { 
    fprintf(oput, "Last\t\tFirst\n------------\t-------------\n%s\t%s\n",last_names[i],first_names[i]);
    i--;
}
return 0;
于 2012-10-26T04:30:00.817 に答える