代码之家  ›  专栏  ›  技术社区  ›  Aman Jain

如何在sscanf中传递可变长宽说明符?

c
  •  15
  • Aman Jain  · 技术社区  · 16 年前
    sscanf(input_str, "%5s", buf); //reads at max 5 characters from input_str to buf
    

    char fmt_str[100] = "";    
    snprintf(fmt_str, 100, "%%%ds", MACRO_SIZE);
    sscanf(input_str, fmt_str, buf);
    

    有没有更好的方法来实现同样的目标?

    3 回复  |  直到 16 年前
        1
  •  10
  •   unwind    8 年前

    就像斯特凡说的,但 sscanf() 为了更准确地回答这个问题,并使用更多的宏观技巧:

    #define MACRO_SIZE 5
    
    #define FORMAT(S) "%" #S "s"
    #define RESOLVE(S) FORMAT(S)
    
    char buf[MACRO_SIZE + 1];
    sscanf(input_str, RESOLVE(MACRO_SIZE), buf);
    

    MACRO_SIZE 是一个预处理器宏,而不是一个正常的运行时变量。

    RESOLVE() 因为否则争论将无法解决 #define d值,我们最终得到一个格式化字符串 "%MACRO_SIZEs"

        2
  •  8
  •   Stefan    16 年前

    #define MACRO_SIZE "5"
    snprintf(fmt_str, 100, "%" MACRO_SIZE "s", buf);
    
        3
  •  3
  •   Whaledawg    16 年前

    “正确”的解决方案就是你所说的琐碎的解决方案。所有这些聪明的宏(我自己会用m4)只会让你的代码变得不那么容易管理,如果你把它作为一个常数。