0 の scanf 幅指定子を使用するには?
1) 無制限の幅 (cywin gcc バージョン 4.5.3 で見られるように)
2) UB
3) 何か他のもの?
私のアプリケーション (表示されていません) は、scanf() のより大きなフォーマット文字列の一部として幅指定子を動的に形成します。"%0s"
フォーマット文字列の途中にが作成されることはほとんどありません。このコンテキストでは、宛先文字列にはを格納する%0s
ためのスペースが 1 バイトしかなく、上記の動作 #1 で問題が発生します。scanf()
\0
注: 次のテスト ケースでは、定数形式を使用します。
#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 である場合、別の方法で幅が 0 の状況にアプローチする必要がありますか、または他の scanf() 形式を考慮する必要がありますか?