2012-05-31 14 views
11

私はint型の文字列を持っています。私はint型を別の配列に変換しようとしています。 sscanfがintを見つけられなかったとき、私はループを止めたいです。だから、私は次のようでした:sscanfは移動せず、毎回同じ整数をスキャンします。 C

int i; 
int getout=0; 
for(i=0; i<bsize && !getout;i++){ 
    if(!sscanf(startbuffer, "%d", &startarray[i])){ 
    getout=1; 
    } 
} 
//startbuffer is a string, startarray is an int array. 

これはstartbufferで最初の文字であることをstartarrayのすべての要素を持つことになります。 sscanfは正常に動作しますが、最初の位置に留まる次のintには移動しません。

何が悪いと思いますか?ありがとう。

+0

[sscanf関数によって読み込まれた文字数を取得する?](http://stackoverflow.com/questions/13503135/get-number-of-characters-read-by-sscanf) – sashoalm

答えて

12

sscanfを呼び出すたびに同じ文字列ポインタが渡されます。入力を「移動」する場合、長い文字列の場合は遅くなるたびに文字列のすべてのバイトを移動する必要があります。さらに、がスキャンされていないバイトを移動することになります。

代わりに、消費したバイト数と読み取られた値の数を照会することで、これを実装する必要があります。その情報を使用してポインタを自分で調整します。

int nums_now, bytes_now; 
int bytes_consumed = 0, nums_read = 0; 

while ((nums_now = 
     sscanf(string + bytes_consumed, "%d%n", arr + nums_read, & bytes_now) 
     ) > 0) { 
    bytes_consumed += bytes_now; 
    nums_read += nums_now; 
} 
+0

'bytes_consumed == strlen(string)'のときに 'nums_now'の偽の値を取得しています(ループを破るべき最後の呼び出し)。これもあまり期待されていますか? –

+0

@mangledorf [spec](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html)によると、「入力が最初の変換(ある場合)が完了する前に終了し、照合失敗が発生した場合は、EOFを返すものとする。これは、ゼロが本質的に負のものに再マッピングされるように思えます。 – Potatoswatter

+0

ああ!したがって、num_rowsは_signed_整数であることが非常に重要です。それはむしろ微妙です。 –

4

これはsscanfの正しい動作です。 sscanfは、ファイルからの入力ストリームではなく、const char*で動作するため、消費した情報は保存されません。

解決策としては、フォーマット文字列に%nを使用して、これまでに消費した文字数を取得できます(これはC89標準で定義されています)。

sscanf("This is a string", "%10s%10s%n", tok1, tok2, &numChar);numCharはこれまでに消費された文字数を含みます。これをオフセットとして使用して文字列のスキャンを続けることができます。

文字列にlong型(またはlong long型)の最大値を超えない整数のみが含まれる場合は、strtolまたはstrtollを使用します。システムによっては、longのタイプは32ビットまたは64ビットになることに注意してください。

4

あなたは正しいです:sscanf実際には移動しないので「移動」しません。一束のintをスキャンする必要がある場合は、strtolを使用することができます。これは読み込み量を示しているので、次のポインタを次の繰り返しで関数に戻すことができます。

char str[] = "10 21 32 43 54"; 
char *p = str; 
int i; 
for (i = 0 ; i != 5 ; i++) { 
    int n = strtol(p, &p, 10); 
    printf("%d\n", n); 
} 
関連する問題