使用scanf - > ANSI C的最大字符串长度

tom*_*ies 6 c scanf visual-studio-2010

我有:

#define MAX_STR_LEN 100
Run Code Online (Sandbox Code Playgroud)

我想进入scanf模式,所以我可以控制字符串长度:

scanf("%100[^\n]s",sometext)
Run Code Online (Sandbox Code Playgroud)

我试过了:

scanf("%MAX_STR_LEN[^\n]s",sometext)
scanf("%"MAX_STR_LEN"[^\n]s",sometext)
scanf("%",MAX_STR_LEN,"[^\n]s",sometext)
Run Code Online (Sandbox Code Playgroud)

它没有用.我只是想避免缓冲区溢出,因为"sometext"分配了malloc(MAX_STR_LEN)...

有任何想法吗?

小智 10

我对这些解决方案都不满意,所以我进一步研究,发现了GNU GCC宏 字符串化

可以用作:

#define XSTR(A) STR(A)
#define STR(A) #A
#define MAX_STR_LEN 100
scanf("%"XSTR(MAX_STR_LEN)"[^\n]s", sometext)
Run Code Online (Sandbox Code Playgroud)

也许VS2010提供类似的东西?

  • 这是ANSI C标准 - 它*真的应该与VS 2010一起使用.(鉴于VS的特性,我不确定.) (5认同)
  • 这是正确的答案.对每个人说"不要使用scanf()":这应该足以避免OP所描述的缓冲区溢出. (2认同)

小智 7

我只是想避免缓冲区溢出

然后不要使用scanf().完全没有.

如果要扫描文本行,请不要#define MAX_STR.您可以LINE_MAX进入<limits.h>(如果您的目标是POSIX兼容系统):

char buf[LINE_MAX];
fgets(buf, sizeof(buf), stdin);
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.