【问题标题】:Is there any way to use a variable inside sscanf modifiers有没有办法在 sscanf 修饰符中使用变量
【发布时间】:2021-01-29 15:39:50
【问题描述】:

如何使用max_size 变量来仅获取所需的字符?

int max_size=64;
sscanf(p,"%s %(MAX_SIZE-1)[^\n]",a,b);

【问题讨论】:

  • 您可以使用sprintf 创建scanf 格式字符串。
  • 简短的回答是“不”。您想为此使用的*(类似于printf)被suppress-assignment 修饰符篡夺了scanf
  • 这只是scanf 的大约 17 个不同的严重限制之一。在几乎所有情况下,此功能根本不值得使用。如果您关心做任何复杂的事情 - 例如,在您的情况下,避免缓冲区溢出 - 无论您想要做什么,要么使用 scanf 是不可能的,要么是使用其他技术的三倍。 (是的,我同意,避免缓冲区溢出并不是“复杂的事情”,而是基本要求。)
  • C FAQ list 中查看question 12.15
  • 谢谢大家的快速响应,我设法用 sprintf 做到了

标签: c scanf


【解决方案1】:

使用sscanf,您必须首先准备格式化字符串。顺带一提:

char *fmt;
int r = asprintf(&fmt, "%%s %%%u[^\n]", (unsigned)MAX_SIZE - 1);
if (r < 0) abort();
sscanf(p, fmt, a, b);
free(fmt);

这种解决方案的可悲之处在于编译器停止警告您有关无效说明符的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2019-06-29
    • 1970-01-01
    • 2010-12-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多