scanf()可变长度说明符

CS *_*ent 11 c scanf

如何使用变量指定scanf()应读入的最大字符数?

例如使用printf()你可以像这样使用*

#define MAXVAL 5
printf("Print at maximum MAXVAL chars: %.*s\n", MAXVAL, "myStringHere");
Run Code Online (Sandbox Code Playgroud)

这只会打印5个字符,如何才能scanf在MAXVAL中读取?MAXVAL必须用作长度说明符.我不能简单地做

scanf("%5s", string);
Run Code Online (Sandbox Code Playgroud)

现在我只能想到读入一个大数组scanf然后ssprintf用来将字符串存储到我的长度有限的字符串中.然而,使用长度说明符会更容易.

R S*_*ahu 16

您可以使用C预处理器来帮助您.

#define STR2(x) #x
#define STR(X) STR2(X)
scanf("%" STR(MAXVAL) "s", string);
Run Code Online (Sandbox Code Playgroud)

该处理器结合"%" STR(MAXVAL) "s""%5s"

  • @CSStudent:这两个定义是必要的,以便正确扩展参数.也就是说,如果`STR(X)`被简单地定义为`#x`,则`STR(MAXVAL)`将扩展为`#MAXVAL`,这意味着`scanf`调用将扩展为`scanf("%"" MAXVAL""s",string);`,这不是你想要的.通过使用第二个定义,`MAXVAL`将在被字符串化之前扩展为5. (4认同)
  • @CSStudent,请查看http://stackoverflow.com/questions/16989730/c-stringify-how-does-it-work. (2认同)

BLU*_*IXY 5

#include <stdio.h>

#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;
}
Run Code Online (Sandbox Code Playgroud)