【问题标题】:Guard scanf from reading too many characters with a define? [duplicate]使用定义防止 scanf 读取太多字符? [复制]
【发布时间】:2018-02-25 16:54:13
【问题描述】:

通常,我使用定义来定义字符串的大小,但是当我使用scanf() 时,我想防止函数读取太多字符(并为空终止符保留空间)。我想知道是否可以使用我的定义而不是硬编码的幻数来做到这一点......

#include <stdio.h>

#define MAXLEN 4

int main(void) {
    char a[MAXLEN];
    scanf("%3s", a); // Can I do that with 'MAXLEN' somehow?
}

有可能吗?如果是,怎么做?

【问题讨论】:

  • 使用 MAXLEN 3;然后定义char a[MAXLEN + 1]
  • 我已经链接到副本了,但是你为什么不使用fgets()sscanf()呢?
  • 我可以,但我想知道scanf()@IharobAlAsimi,谢谢!
  • @gsamaras 我在原始问题中发布了另一个解决方案(我在此处发布但已关闭)

标签: c arrays string scanf c-preprocessor


【解决方案1】:

使用定义进行字符串化:

#define LENSTR_(x) #x
#define LENSTR(x) LENSTR_(x)

那么你可以使用:

#define MAXLEN 3

char a[MAXLEN + 1];
scanf("%" LENSTR(MAXLEN) "s", a);

【讨论】:

  • @Jean-FrançoisFabre 因为这就是 C 语言中宏参数值的字符串化...
  • @AnttiHaapala:是的,但大多数人只是复制该模式而不知道为什么这是必要的。对于变量字段,这并不像预期的那样工作。如果你有 VLA 怎么办?
  • 这仅适用于MAXLEN 是十进制整数文字。 #define MAXLEN 0x10 会失败
  • @Jean-FrançoisFabre:仅使用一个宏将扩展为 "MAXLEN"。两级方法首先扩展到LENSTR_(3),然后将其字符串化为"3"
  • @savram:# 是宏定义中的“字符串化”或“字符串化”运算符。它将参数转换为 C 字符串文字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多