char szA[256]={0};
scanf("%[^a]%s",&szA); //failed when trailing string
scanf("%[^a]|%s",&szA); //worked whatever the input
'|'是什么表示格式字符串。我找不到官方规格。有没有人可以给我一些线索?
当我输入几个'|'的东西时,后者仍然有效(只是意味着程序没有崩溃)。它是否需要在格式字符串后给出两个缓冲区。当输入字符串可以分成多个字符串时,前者崩溃了。所以它们之间还存在其他差异。它是什么 ?
所以,当前一个失败时缓冲数小于指令数时,我无法理解为什么后一个工作。或者有人可以给我一个输入字符串,以使后者崩溃。
答案 0 :(得分:4)
'|'是什么表示格式字符串。我找不到官方规格。有没有人可以给我一些线索?
这意味着代码需要输入流中的文字|
。
话虽如此,格式说明符不起作用。
%[^a]
部分将捕获所有不是a
的字符。这意味着它甚至可以从输入流中捕获|
。当流中遇到角色a
时,它将停止捕获。当然,这与格式字符串中的文字|
不匹配。因此,之后什么都不会被处理。
如果我将输入def|akdk
提供给以下程序
#include <stdio.h>
int main()
{
char szA[256] = {0};
char temp[100] = {0};
int n = scanf("%[^a]|%s", szA, temp);
printf("%d\n%s\n%s\n", n, szA, temp);
}
我得到以下输出
1
def|
这非常有意义。顺便说一下,输出中的最后一行是空行。我不确定如何在答案中表明这一点。
当我将scanf
行更改为
int n = scanf("%[^a]a%s", szA, temp);
我得到以下输出
2
def|
kdk
这很有道理。
答案 1 :(得分:2)
它不是格式说明符之一,因此它是文字 |
字符,这意味着它必须存在于输入流中。 官方规范是ISO标准中标题为The fscanf function
的部分(例如C11 7.21.6.2
),相关部分说明:
格式由零个或多个指令组成:一个或多个空格字符,普通的多字节字符(既不是%也不是空白字符),或转换规范。
通过读取流的下一个字符来执行作为普通多字节字符的指令。如果这些字符中的任何一个与组成该指令的字符不同,则该指令将失败,并且不同和后续字符仍然未读。
您可以在以下完整程序中看到效果,当您查找文字"four|1"
时,该效果无法扫描_
,但在您查找|
时效果正常。
#include <stdio.h>
int main(void) {
char cjunk[100];
int ijunk;
char inStr[] = "four|1";
if (sscanf(inStr, "%4s_%d", cjunk, &ijunk) != 2)
printf ("Could not scan\n");
if (sscanf(inStr, "%4s|%d", cjunk, &ijunk) == 2)
printf ("Scanned okay\n");
return 0;
}
答案 2 :(得分:0)
所以,经过一番对话,在我的理解中,后者要求剩下的流以&#39; |&#39;开头。在处理&#39; |%s&#39;指示。虽然前指令排除了&#39; a&#39;并留下剩余的流以&#39; a&#39;开头。因此,尾随指令始终不匹配,并且不需要将任何内容放入缓冲区。所以即使没有给出缓冲区,它也不会崩溃。