5

sscanf()ソースコードを探すために調べてみました。しかし、私は私の質問に対する答えを見つけることができませんでした。

このように使用する場合sscanf()

char str[50] = "5,10,15";
int x;
sscanf(str,"%d,%s",&x,str);

sscanf()は「再帰的」バッファをサポートしていますstrか?

4

4 に答える 4

3

scanfファミリー関数は、フォーマット指定子を読み取り、1つずつ変換を行います。サンプルコードでは:

char str[50] = "5,10,15";
int x;
sscanf(str,"%d,%s",&x,str);

最初に整数と別のc文字列を読み取るため、機能する可能性があります。str元の値が新しい値で上書きされるため、ここでは問題ありません。

ただし、次のことを考慮してください。

char str[50] = "5 10 15";
int x;
sscanf(str,"%s %d",str, &x);

最初5に元の値から読み取り、上書きします。前回の読み取りのヌル終了により、の終わりに達したためstr、後続のフォーマット指定子%dは何も読み取ることができません。strstr%s

これは、それが悪い考えであり、機能しないことを示すための単なる反例です。したがって、これはある時点で未定義の動作を引き起こしたり、他の問題を引き起こしたりする可能性があると言えます。

于 2012-11-27T10:52:18.573 に答える
3

自己変更バッファからは壊れません。ただし、(末尾)再帰的にするには、文字列の最後まで読み取る必要があります。
コードフラグメント:

char str[]="5,10,15";
int a[10]={0},x = 0; 
while (sscanf(str,"%d,%s",a+ x++,str)>1);

すべての整数を読み取ります。

これは実際には再帰的ではなく、読み取る文字列が文字列内のasciizを上書きしないため、これは意味的に「安全」であると思います。自宅でのみ試してください。

于 2012-11-27T10:44:42.947 に答える
1

一般的に私はこれに反対することをお勧めします。それが一度機能するのであれば、それはすべてのコーナーケースで機能するという意味ではありません。確かに、使用している実装そのもののソースを確認する必要があります。ポータブルにしたい場合は、libc仕様に保証された動作として記述されている場合を除いて、すぐに忘れてください。strchr()次の区切り文字を検索し、次の文字を指すように文字列ポインタを更新するために使用します。

于 2012-11-27T10:51:57.233 に答える
0

を使用するとstrtok()、私が抱えていたほぼ同じ問題が解決されました。つまり、sscanf()再帰的にaの内容char* (たとえば、スペースで区切られたdoubleのリスト"1.00 2.01 ...")をdouble配列(たとえば、、、array[1]=1.00... array[2]=2.01)に抽出するために使用しました。

私があなたの問題を理解していると私が信じるならば、以下は役立つかもしれません:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, char** argv)
{
    char str[]= "5,10,15";
    char* token;

    int x[3];

    token = strtok(str, ",");

    for(int i=0; i<3; i++){

            sscanf(token, "%d", &x[i]);

            token = strtok(NULL, ",");

    }

    for(int i=0; i<3; i++) printf("%d\n", x[i]);

    return 0;
}

実行すると、次のようになります。

5
10
15

の有用な説明については、http://www.cplusplus.com/reference/cstring/strtok/を参照してくださいstrtok()

于 2015-07-03T22:56:00.193 に答える