1

ファイルからの情報を構造体に保存したいと思います。私のファイルは行 (各行は異なる構造である必要があります) と列で構成され、各列は異なるデータです。ファイルは次のようになります。

1 AB
2 CD
3 CD
4 AB

私の構造はこれです(ノード番号は最初の整数で、ノードタイプは2文字です):

struct nodes{
int nodeNumber;
char nodeType[2];
};

これまでの私のコードは次のとおりです。

lines = lineCount(nodes); //calculates how many lines file has
struct nodes node[lines]; //creates structure array
no = fopen(nodes, mode);
if(no == NULL){
    printf("Can't find the files.");
    exit(1);
}else{
    for(i = 0; i < lines; i++){
        fscanf(no, "%d %2c \n", &id, current);
        node[i].nodeNumber = id;
        strcpy(node[i].nodeType, current);
    }
}

現在の値をデバッグすると、次のようになります。 000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ 000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ 000\000\000\000\000\000\000\000\" だけではなく、AB

何か案は?

4

2 に答える 2

1

問題はあなたの使い方ですstrcpystring、つまりターミネータ付きの文字配列をコピーします。これはstrcpy、文字列ターミネータ文字が検出されるまでコピーし、それを配列の最後'\0' 配置することを意味します。つまり、配列の外側の 1 バイトを上書きすることになります。

文字ごとに手動でコピーするか、 などの関数を使用するかmemcpy、配列のサイズを 3 に増やして、終了文字に収まるようにします (つまり、 の定義currentもサイズ 3 で、文字列ターミネータを使用していることを確認する必要があります)。 )。

于 2012-12-12T06:51:54.577 に答える
0

scanf%c形式コードで読み取った文字をヌル終了しません。(明らかcurrentにNULがたくさんありますが、それを当てにできるかどうかはわかりません.

として宣言currentし、の代わりに 2 の長さでchar[2]使用する必要があります。memcpystrcpy

于 2012-12-12T06:48:21.750 に答える