'|' scanf 格式字符串是什么意思


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"开头的流。因此,尾随指令始终不匹配任何内容,并且不需要将任何内容放入缓冲区。因此,即使没有给出缓冲区,它也不会崩溃。

相关内容

  • 没有找到相关文章

最新更新