C:scanf_s忽略“%n”(读取的字符数)

时间:2016-11-25 14:57:57

标签: c scanf

我希望使用string阅读scanf并获取实际的str长度,然后再realloc。我已经读过%n给出了number of chars read,这就是我需要的。 Visual Studio要求我使用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它说的太多args,如果我带走了&actual_length它说的太少了args。如果我带走两者,结果显然是相同的。

我尝试谷歌40分钟而且我被卡住了。 MSDN没有说明有关scanf_s处理%n的任何具体内容。

1 个答案:

答案 0 :(得分:2)

BLUEPIXY在评论中回答了这个问题:

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

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