0

こんにちは、以下のデータを含むテキスト ファイルがあります。

ABC00011234567
XYZ00021234567

データを取得するために、構造を定義しました

typedef struct data {
 char x[3];
 char y[4];
 char z[7];
} key;

プログラムで私がしていることは、各行を読み取り、それを構造に割り当てることです

unsigned char buf[1024];
fgets(buf,sizeof(buf),fptr); 
key *k=(key*)buf;
int y = atoi(k->y)
printf( "y=%d\n",y);`

出力を次のように取得しています

y=1123456
y=2123456

私が期待している出力は

y=1
y=2

atoi は文字列のポインタを取得し、EOF に遭遇するまで繰り返しますか? 1値を取得するにはどうすればよい2ですか?

4

4 に答える 4

2

atoiはヌル終了文字列を取ります。データ解析keyの長さを制限したい場合は、メンバーに独自のターミネータを追加する必要がありますatoi

于 2012-10-09T10:43:33.323 に答える
2

atoi()文字列の末尾または無効な文字に到達するまで続行すると想定する必要があります。たとえば、文字列 `"123zzz" の場合、123 が返されます。

文字列を終了し (文字列の末尾に 0 を追加)、使用を停止するatoi()(strtol()代わりに使用するなど) 必要があります。または、終了文字列を必要としない独自の変換を作成します。

注: (一般に)atoi()コンパイラを書く以外の目的で使用しないでください。これは、通常の人には意味をなさないことを行うためです (たとえば、「0129」は 10 であり、129 ではありません。これは、数値が 8 進数であり、 9 は 8 進数の有効な数字ではありません)。

于 2012-10-09T10:55:51.060 に答える
1

atoi() は、ゼロで終了する文字列を想定しています。あなたの場合、文字列はゼロで終了しないため、y が読み取られた後に z のデータが atoi によって読み取られます。

4 桁だけを読み取るには、sscanf を使用できます。

sscanf(k->y,"%4d",&y);
于 2012-10-09T10:43:40.937 に答える
1

atoi関数は null で終わる文字列を想定しています。の境界を越えて終了する char 配列の一部を渡しているkey::yためatoi、値全体が数値として解釈されます。キーを解析する「クッキーカッター」メソッドに固執したい場合は、コピーを作成してに渡す必要がありますatoi

char temp[5];
memcpy(temp, k->y, 4);
temp[4] = '\0';
int y = atoi(temp);

fscanfただし、使用する方が良い選択だと思います:

char x[4];
int y, z;
fscanf(fptr, "%3s%4d%7d", x, &y, &z);
printf("%s %d %d", x, y, z);
于 2012-10-09T10:43:41.763 に答える