'|'是什么以scanf格式字符串

时间:2018-03-20 04:36:24

标签: c++ c scanf placeholder

char szA[256]={0}; 
scanf("%[^a]%s",&szA);   //failed when trailing string 
scanf("%[^a]|%s",&szA);   //worked whatever the input 

'|'是什么表示格式字符串。我找不到官方规格。有没有人可以给我一些线索?

当我输入几个'|'的东西时,后者仍然有效(只是意味着程序没有崩溃)。它是否需要在格式字符串后给出两个缓冲区。当输入字符串可以分成多个字符串时,前者崩溃了。所以它们之间还存在其他差异。它是什么 ?

所以,当前一个失败时缓冲数小于指令数时,我无法理解为什么后一个工作。或者有人可以给我一个输入字符串,以使后者崩溃。

3 个答案:

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