我希望使用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
的任何具体内容。
答案 0 :(得分:2)
BLUEPIXY在评论中回答了这个问题:
“%[^\n]s%n
” - > “%[^\n]%n
”
在这种情况下,s
不正确。 s
是一个不是转换说明符的名称。它被解释为匹配的角色。但是,由于匹配字符实际上不存在,因此输入将在s
处失败。因此%n
不会被解释。