2016-11-25 97 views
3

我想用scanf来读取string并获得实际的字符串长度,然后在realloc之后。我读过%n给出了number of chars read,所以这就是我所需要的。 Visual Studio要求我使用scanf_s,在每个字符串之后,您必须指定它的缓冲区大小。C:“%n”(读取的字符数)被scanf_s忽略

我写:

int actual_length; 
scanf_s("%[^\n]s%n", str, MAX_STRING_LEN, &actual_length); 
printf("actual length = %d\n", actual_length); 

我得到:

actual length = -858993460 

所以,当我加入这个%n什么都没有发生。如果我拿走%n它说太多的参数,如果我拿走&actual_length它说的参数太少。如果我拿走的结果是一样的,显然。

我试图谷歌40分钟,我卡住了。 MSDN并没有说任何关于scanf_s处理%n的具体信息。

+7

'“%[^ \ n] s%n”' - >'“%[^ \ n]%n”' – BLUEPIXY

+0

这没有任何意义,但它有效。谢谢! – Sam

+0

@BLUEPIXY请问您想补充说明吗? –

回答

2

BLUEPIXY回答在评论这个问题:

%[^\n]s%n” - > “%[^\n]%n

在这种情况下,s是不正确的。 s是它不是转换说明符的名称。它被解释为匹配的字符。但是,由于匹配字符实际上不存在,输入将在s处失败。所以%n不解释。