char szA[256]={0};
scanf("%[^a]%s",&szA); //failed when trailing string
scanf("%[^a]|%s",&szA); //worked whatever the input
格式字符串中的"|"是什么意思。我找不到官方规格。有没有人能给我一些线索?
当我输入带有多个"|"的东西时,后者仍然有效(只是意味着程序没有崩溃)。它不需要在格式字符串之后给出两个缓冲区吗?当输入字符串可以分成多个字符串时,前者崩溃了。所以它们之间还有其他区别。这是什么?
所以,我不明白为什么当缓冲区编号小于指令号而前一个失败时,后者会起作用。或者有人可以给我一个输入字符串来使后者崩溃。
字符串中的"|"是什么意思。我找不到官方规格。有没有人能给我一些线索?
这意味着代码需要输入流中的文字|
。
话虽如此,该格式说明符将不起作用。
%[^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("%dn%sn%sn", n, szA, temp);
}
我得到以下输出
1
def|
这是完全有道理的。顺便说一句,输出中的最后一行是空行。我不知道如何在答案中表现出来。
当我将scanf
行更改为
int n = scanf("%[^a]a%s", szA, temp);
我得到以下输出
2
def|
kdk
这是完全有道理的。
它不是格式说明符之一,因此它是文字|
字符,这意味着它必须存在于输入流中。官方规范是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 scann");
if (sscanf(inStr, "%4s|%d", cjunk, &ijunk) == 2)
printf ("Scanned okayn");
return 0;
}
因此,经过一些对话,在我的理解中,后者需要剩余的流以"|"开头 处理 '|%s' 指令时。而前一个指令排除了"a"并保留了以"a"开头的流。因此,尾随指令始终不匹配任何内容,并且不需要将任何内容放入缓冲区。因此,即使没有给出缓冲区,它也不会崩溃。