2017-10-29 10 views
0

ファイルからテキストを読み込み、構造体の配列に格納するためにCを使用しています。 しかし、私はprintfを使ってそれを印刷した後、出力は私が期待したものではありません。ファイルからテキストを読み込みますが、正しく表示されません。

マイコード:

#include<stdio.h> 
struct userINFO { 
    char id[6]; 
    char name[20]; 
    char lastName[20]; 
}; 
int main() 
{ 
    FILE *fdata; 
    struct userINFO allUser[3]; 
    int i=0; 
    fdata = fopen("textdata.txt","r"); 

    if (fdata == NULL) 
    { 
     printf("ERROR!"); 
     return 0; 
    } 

    while (fscanf(fdata,"%s %s %s", allUser[i].id, allUser[i].name, allUser[i].lastName)!=EOF) 
    { 
     i++; 
    } 

    for (i = 0; i < 3 ; i++) 
    { 
     printf("ID: %s\n", allUser[i].id); 
     printf("Name: %s\n", allUser[i].name); 
     printf("LastName: %s\n", allUser[i].lastName); 
    } 
    fclose(fdata); 

    return 0; 
} 

テキストファイル:

001001 
Firstname1 
LastName1 
601002 
Firstname2 
LastName2 
601003 
Firstname3 
LastName3 

出力

ID: 001001Firstname1 
Name: Firstname1 
LastName: LastName1 
ID: 601002Firstname2 
Name: Firstname2 
LastName: LastName2 
ID: 601003Firstname3 
Name: Firstname3 
LastName: LastName3 

それがどうあるべきか:

ID: 001001 
Name: Firstname1 
LastName: LastName1 
ID: 601002 
Name: Firstname2 
LastName: LastName2 
ID: 601003 
Name: Firstname3 
LastName: LastName3 

私はfscanf - > fgetsを変更したり、printfに%6sを追加したり、テキストフォーマットを変更するなど、多くのことを試しましたが、その出力は同じです。 正しく表示されるようにコードを変更する必要がありますか?

+3

'id'配列は6文字を保持でき、idは6文字です。しかし、終了するヌル文字のためのスペースも確保する必要があります。そうでないと、終端のヌルは 'name'の最初の文字に書き込まれます。それは次の文字列スキャンによって上書きされます。したがって、文字列 'id'はbの' name'に実行されます。あなたの配列を大きくする。また、バッファオーバーフローを防ぐために、読み込み時に文字列のサイズを制限する必要があります。 –

答えて

1

シンプルです。変更:Cで

struct userINFO { 
    char id[6]; 
    char name[20]; 
    char lastName[20]; 
}; 

struct userINFO { 
    char id[7]; 
    char name[20]; 
    char lastName[20]; 
}; 

、あなたは文字列の終わりを示す\0ための1つの余分な文字を必要としています。

Cはかなり低いレベルなので、printfは文字列のために予約されているメモリの量を知らない。 printfが知っているのは、それが始まる場所だけです。その後、それが\0に達するまで続きます。配列の外側を読み取ると、の未定義の動作が発生します。

1

構造体では、長さ6の文字列を使用していますが、 '\ 0'文字を考慮する必要があります。したがって、IDの長さを7にすると、あなたの問題は解決されます。

#include<stdio.h> 
struct userINFO { 
    char id[7]; 
    char name[20]; 
    char lastName[20]; 
}; 
int main() 
{ 
    FILE *fdata; 
    struct userINFO allUser[3]; 
    int i=0; 
    fdata = fopen("textdata.txt","r"); 

    if (fdata == NULL) 
    { 
     printf("ERROR!"); 
     return 0; 
    } 

    while (fscanf(fdata,"%s %s %s", allUser[i].id, allUser[i].name, allUser[i].lastName)!=EOF) 
    { 
     i++; 
    } 

    for (i = 0; i < 3 ; i++) 
    { 
     printf("ID: %s\n", allUser[i].id); 
     printf("Name: %s\n", allUser[i].name); 
     printf("LastName: %s\n", allUser[i].lastName); 
    } 
    fclose(fdata); 

    return 0; 
} 
関連する問題