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); }