我遇到了一些代码,想知道什么原开发商达。下面是使用这种模式的简化程序:

      #include <stdio.h>

      int main()  {     

      char title[80] = "mytitle";      
      char title2[80] = "mayataiatale";      
      char mystring[80]; 

      /* hugh ? */
      sscanf(title,"%[^a]",mystring);
      printf("%s\n",mystring); /* Output is "mytitle" */


      /* hugh ? */
      sscanf(title2,"%[^a]",mystring); /* Output is "m" */
      printf("%s\n",mystring);


      return 0;  
  }

href="https://linux.die.net/man/3/scanf" rel="nofollow noreferrer">手册页scanf的的

有帮助吗?

解决方案

对字符类最主要的原因是为了让%s的符号停止在第一个空格字符,即使您指定字段长度,你经常不希望它。在这种情况下,字符类符号可以是非常有益的。

考虑此代码来读取一行最多10个字符的,丢弃任何多余的,但保持位:

#include <ctype.h>
#include <stdio.h>

int main(void)
{
    char buffer[10+1] = "";
    int rc;
    while ((rc = scanf("%10[^\n]%*[^\n]", buffer)) >= 0)
    {
            int c = getchar();
            printf("rc = %d\n", rc);
            if (rc >= 0)
                    printf("buffer = <<%s>>\n", buffer);
            buffer[0] = '\0';
    }
    printf("rc = %d\n", rc);
    return(0);
}

这实际上是要讨论的示例代码上comp.lang.c.moderated(大约2004年6月),以getline()变体相关。


至少一些混乱统治。第一格式说明,%10[^\n],读取多达10个非换行字符和它们被分配到缓冲,后面带有一个空沿。所述第二格式说明,%*[^\n]包含分配抑制字符(*),并读取零个或多个剩余的从输入非换行符。当scanf()功能完成后,输入下一个换行符指出。在循环体中读取并打印字符,因此,当循环重新开始,输入被看下一行的开始。然后该过程重复。如果该行是超过10个字符短,则这些字符被复制到缓冲器,而“零个或多个非换行符”格式来处理零非换行。

其他提示

%[a]%[^a]的构建体存在,使得scanf()可以用作一种词法分析器。这些都是有点像%s,但不是收集尽可能多的“粘性”的字符尽可能的跨度,由字符类描述他们只是收集字符的跨度。可能有情况下,书写%[a-zA-Z0-9]可能是有意义的,但我不知道我看到的互补班,scanf()一个引人注目的使用情况。

恕我直言,scanf()根本就不是这个工作的工具。每次我开始着手利用其更强大的功能有一段时间,我已经结束了最终翻录,落实以不同的方式的能力。在某些情况下使用法写一个真实词法分析器,但通常做线在时间I / O和粗分解成与strtok()令牌做值变换前是足够了的意思。

编辑:我结束通常剥开scanf()因为当面对用户坚持提供不正确的输入,它只是不擅长于帮助程序提供了有关该问题的良好反馈,并且具有汇编打印“错误,终止。”作为其唯一有用的错误消息是不会在好与我的用户。 (我,在这种情况下。)

这就像字符集从正则表达式; [0-9]数字字符串匹配时,匹配[^aeiou]任何不是小写元音等

有各种用途,例如拉出的数字,识别符,空白的大块等

您可以在 ISO读到它/ IEC9899标准可以在线获得。

下面是一个段落我从文档引用约[(页286):

  

匹配从一组字符的非空序列的预期   字符。

     

在转换指定包括在所有后续字符   格式字符串,直至并包括匹配的右括号(])。该   支架(扫描列表)之间的字符组成扫描集,   除非左括号后的字符是一个音调符号(^),在   这种情况下,扫描集包含不会出现在所有的字符   抑扬和右支架之间的扫描列表。如果   转换说明开始于[]或[^],右支架   字符在扫描列表和下一个随后的右支架   字符表示结束说明书中的匹配的右支架;   否则第一以下右括号字符是一个   结束本说明书。如果 - 个字符是扫描列表,而不是   第一,或第二,其中第一个字符是^,也不是   最后一个字符,该行为是实现定义的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top