簡體   English   中英

為什么 sscanf 不能與 bool 類型一起正常工作

[英]Why does sscanf not work properly with a bool type

這段代碼的output:

const char *buff = "*_2D 1";
char field[10];
int flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", field, flag);

field:*_2D flag:1

然而,通過將int更改為bool會導致奇怪的行為:

const char *buff = "*_2D 1";
char field[10];
bool flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", field, flag);

output 是field: flag:1

誰能解釋這里發生了什么? 我原以為 bool 會被解釋為一個 int,它似乎是,但字符串的 rest 消失了。

想象一下,如果bool只有一個字節,而不是int使用的四個(甚至八個)字節。 然后告訴sscanf &flag是一個指向int的指針,最終會覆蓋堆棧上其他地方的三個或七個字節——這可能就在你的field變量的頂部。 該空間將填充 0 個字節,有效地終止您的字符串。

bool是與int不同的類型,並且可能是單個字節(在大多數常見平台上小於int )。

sscanf不是類型安全的; 您正在告訴它(使用%d轉換說明符)您正在提供一個指向int的指針,因此它假定在那里寫一個int是安全的。 如果實際類型更小,那么您將獲得未定義的行為; 最有可能的是,其他局部變量將被覆蓋,或者堆棧幀將被破壞。 在這種情況下,看起來它正在用 integer 值1的零值字節覆蓋field的開頭。

可能是因為sizeof(bool)有時是1 所以,我不太了解 C++,但在 C 中,這將是未定義的行為。

根據sscanf 的規范, %d 的描述是:

匹配可選帶符號的十進制 integer... 在沒有大小修飾符的情況下,應用程序應確保相應的參數是指向 int 的指針。

同樣來自相同的規格,

如果轉換的結果不能在提供的空間中表示,則行為未定義。

由於 sizeof(bool) < sizeof(int),你處於可怕的未定義行為區域,任何事情都可能發生。

sscanf function 失敗,因為bool不是int而是char

試試這個:

const char *buff = "*_2D 1";
char field[10];
char flag;
sscanf(buff, "%s %d", field, &flag);
printf("field:%s flag:%i\n", field, flag);

它會給你同樣的錯誤。

如果您使用的是 C++ (從您的評論看來就是這種情況),為什么不使用 C++ 流而不是 C 風格的scanf方法?

const std::string buff = "*_2D 1";
std::string field;
bool flag = false;
std::istringstream ss(buff);
ss >> field >> flag;
std::cout << "field:" << field << " flag:" << flag << std::endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM