我有一些代碼喜歡這裏:scanf函數:與宏(#定義常量)模板中
#define MAXSIZE 100
int main() {
char str[MAXSIZE+1];
scanf("%100s", str);
...
問題是,我仍然有「幻數」 100,儘管定義MAXSIZE。 有沒有辦法將MAXSIZE正確地插入到scanf格式字符串中? (純C,C-99非標準)
我有一些代碼喜歡這裏:scanf函數:與宏(#定義常量)模板中
#define MAXSIZE 100
int main() {
char str[MAXSIZE+1];
scanf("%100s", str);
...
問題是,我仍然有「幻數」 100,儘管定義MAXSIZE。 有沒有辦法將MAXSIZE正確地插入到scanf格式字符串中? (純C,C-99非標準)
有,但你會更好使用fgets()
:
if (fgets(str, sizeof str, stdin) != NULL) {
// process input
}
關於這個好東西(除了一個不容置疑的可讀性增強)是fgets()
需要護理的大小正確,我。即它佔了終止0字符(其中scanf()
沒有),因此在聲明緩衝區時不需要添加一個大小。它也總是NUL終止你的陣列。不太容易出錯。
至於原來的問題:儘量平常「字符串」絕招:
#define REAL_STRINGIFY(x) #x
#define STRINGIFY(x) REAL_STRINGIFY(x)
scanf("%" STRINGIFY(MAXSIZE) "s", str);
但是,這是非常醜陋的,不是嗎?
非常醜陋!沒有人想要甚至想到它。 – haccks
@haccks,但我喜歡它:),一種方法是OP可以聲明一個新的宏#define MAX「100」' –
@haccks正好。那真令人噁心。 – 2013-10-16 17:27:30
你必須使用scanf嗎?如果不是,請嘗試'fgets()' – jev