如何使用scanf寬度說明符0?
1)無限制寬度(與cywin gcc版本4.5.3一致)
2)UB
3)其他?如何使用0的scanf寬度說明符?
我的應用程序(未示出)動態地形成寬度說明作爲scanf的一個更大的格式字符串的一部分()。很少會在格式字符串的中間創建一個"%0s"
。在這種情況下,%0s
的目標字符串只有1個字節的空間用於存儲\0
的scanf()
,其中上述行爲#1導致問題。
注意:以下測試用例使用常量格式。
#include <memory.h>
#include <stdio.h>
void scanf_test(const char *Src, const char *Format) {
char Dest[10];
int NumFields;
memset(Dest, '\0', sizeof(Dest)-1);
NumFields = sscanf(Src, Format, Dest);
printf("scanf:%d Src:'%s' Format:'%s' Dest:'%s'\n", NumFields, Src, Format, Dest);
}
int main(int argc, char *argv[]) {
scanf_test("1234" , "%s");
scanf_test("1234" , "%2s");
scanf_test("1234" , "%1s");
scanf_test("1234" , "%0s");
return 0;
}
輸出:
scanf:1 Src:'1234' Format:'%s' Dest:'1234'
scanf:1 Src:'1234' Format:'%2s' Dest:'12'
scanf:1 Src:'1234' Format:'%1s' Dest:'1'
scanf:1 Src:'1234' Format:'%0s' Dest:'1234'
我的問題是,最後一行。看起來0寬度不會導致寬度限制而不是0寬度。如果這是正確的行爲或UB,我將不得不以另一種方式接近零寬度情況,或者有其他scanf()格式要考慮嗎?
它看起來'%0s'被評估爲'%s'。 0被忽略。但我無法證實這一點。我不知道是否有標準提及這種行爲 – MOHAMED
@chux什麼是UB? –
有一個'*'格式規範來禁止分配。這會有幫助嗎? – Arkadiy