scanf()可变长度说明符
如何使用变量来指定scanf()
应该读入的最大字符数?
例如,使用printf()
您可以像这样使用*
#define MAXVAL 5 printf("Print at maximum MAXVAL chars: %.*s\n", MAXVAL, "myStringHere");
这将只打印5个字符,如何才能使scanf
仅在MAXVAL中读取? MAXVAL必须用作长度说明符。 我不能简单地做
scanf("%5s", string);
现在我只能想到使用scanf
读入一个大型数组,然后使用ssprintf
将字符串存储到我的长度限制字符串中。 然而,使用长度说明符会更容易。
您可以使用C预处理器来帮助您。
#define STR2(x) #x #define STR(X) STR2(X) scanf("%" STR(MAXVAL) "s", string);
处理器将"%" STR(MAXVAL) "s"
与"%5s"
组合在一起
#include #define MAXLEN 5 #define S_(x) #x #define S(x) S_(x) int main(void){ char string[MAXLEN+1]; scanf("%" S(MAXLEN) "s", string); printf("<%.*s>\n", MAXLEN, string); return 0; }
你不能。 你需要使用scanf()
以外的东西。 一个好的和流行的选择是fgets()
,虽然它的语义略有不同: fgets()
将读取一行输入,而带有%s
scanf()
将读取空格分隔的字符序列。
要使用fgets()
,您需要以下内容:
fgets(string, MAXVAL, stdin);
如果由于某种原因你真的想使用scanf()
,请看看这个问题: 如何防止scanf导致C中的缓冲区溢出?
Kernighan和Pike建议使用snprintf()来创建格式字符串。 我将这个想法发展成一种安全读取字符串的方法:
void scan_string(char * buffer, unsigned length) { char format[12]; // Support max int value for the format %s snprintf(format, sizeof(format), "%%%ds", length - 1); // Generate format scanf(format, buffer); } int main() { char string[5]; scan_string(string, sizeof(string)); printf("%s\n", string); }