0

なぜの値はi以前に呼び出された0後なのかしら。sscanfの値が変更されることを期待していiました。

私はWindows7、バージョン3.4.4でcygwingccを使用しています

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

int main()
{
    unsigned char a[] = {1, 2, 3, 4, 5};
    int i = 0;

    printf("\nread value %d\n", sscanf(&a, "%d", &i));
    printf("\nvalue is %d\n", i);
    printf("\nbuffer is %s\n", a);
}

出力は

読み取り値は0です

値は0です

バッファはいくつかの特殊文字です

4

4 に答える 4

2

まず、sscanf の最初の引数は char へのポインターである必要がありますが、char 配列へのポインターを渡していますが、これは間違った型です。ただし、それは質問に接するだけです。

あなたの質問に答えるには: sscanf (他の *scanf 関数と同様) は、その値の書式指定子が文字列で一致する場合にのみ値を書き込みます。したがって、フォーマット指定子 "%d" がある場合、文字列が数字で始まる場合にのみ、指定された int ポインターに int が書き込まれます。あなたが言ったように、あなたの文字列にはガベージのみが含まれています.1から5までの値を持つ(印刷できない)文字と、その後にメモリ内にあるものが続きaます。したがって、数字で始まらないため、数字は書かれていません。

于 2012-06-13T12:52:59.840 に答える
1

sscanf は、文字 \0 で終了しない文字の配列ではなく、STRINGS 用です。

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

文字列から書式設定されたデータを読み取る str からデータを読み取り、パラメータの書式に従って追加の引数で指定された場所に格納します。追加の各引数が指す位置は、書式文字列で指定された対応する型の値で埋められます。

于 2012-06-13T12:47:49.173 に答える
1

コードに予期しない動作はありません。sscanf関数は指定された文字列からデータを読み取り、「埋められた変数の数を返す」ことに注意してください。char配列をソースとして渡してaデータを取得していますが、配列に数字が含まれていない (1と同じではない'1') だけでなく、null で終了していない ('\0'が欠落している) こともあります。

10 進数の整数を"%d"読み取るように指定しますが、指定された配列には 10 進数の整数がsscanfないため、数値は読み取られず、iそのまま残ります。関数は0、変数が満たされていないことを示して戻ります。

渡す配列の宣言sscanfを有効な文字列に変更すると、目的の動作が得られます。試してみてくださいchar a[] = "1 2 3"

于 2012-06-13T12:51:47.983 に答える
0

これにより、期待どおりの結果が得られます。

a既にポインタであるためa、 の最初のパラメータとして十分ですsscanfnullで終了する文字列を出力すると の両方に渡すため、\0最後のエントリとして0 (つまり) を配置することをお勧めします。asscanfprintf

また、読み取り元のデータと一致するように の型を変更しましたiunsigned char

int main()
{
    unsigned char a[] = {1, 2, 3, 4, 5, 0};
    unsigned char i = 0;

    printf("\nread value %d\n", sscanf(a, "%c", &i));
    printf("\nvalue of i is %d\n", i);
    printf("\nbuffer is %s\n", a);
    return 0;
}

注:sscanfからのデータの「読み取り」に失敗したため、以前は 0 を取得していましたa

于 2012-06-13T12:51:43.880 に答える