scanf系列函数支持由%[]表示的扫描集说明符。在scanset中,我们可以指定单个字符或字符范围。处理scanset时,scanf将仅处理属于scanset的那些字符。我们可以通过将字符放在squre括号中来定义scanset。请注意,扫描集区分大小写。

让我们看一下例子。下面的例子只会将大写字母存储到字符数组'str',任何其他字符都不会存储在字符数组中。

/* A simple scanset example */
#include <stdio.h>

int main(void)
{
    char str[128];

    printf("Enter a string: ");
    scanf("%[A-Z]s", str);

    printf("You entered: %s\n", str);

    return 0;
}
  [root @ centos-6 C]#。/ scan-set 
  输入一个字符串:GEEKs_for_geeks
  你进入了:GEEK

如果scanset的第一个字符是'^',则说明符将在第一次出现该字符后停止读取。例如,下面给出的scanset将读取所有字符,但在第一次出现'o'后停止

    scanf("%[^o]s", str);

让我们看一下例子。

/* Another scanset example with ^ */
#include <stdio.h>

int main(void)
{
    char str[128];

    printf("Enter a string: ");
    scanf("%[^o]s", str);

    printf("You entered: %s\n", str);

    return 0;
}
  [root @ centos-6 C]#。/ scan-set 
  输入一个字符串:http:// geeks for geeks
  你输入了:http:// geeks f
  [root @ centos-6 C]# 

让我们使用扫描集实现gets()函数。gets()函数从stdin读取一行到s指向的缓冲区,直到找到终止换行符或EOF。

/* implementation of gets() function using scanset */
#include <stdio.h>

int main(void)
{
    char str[128];

    printf("Enter a string with spaces: ");
    scanf("%[^\n]s", str);

    printf("You entered: %s\n", str);

    return 0;
}
  [root @ centos-6 C]#。/gets 
  输入带空格的字符串:Geeks For Geeks
  你输入了:Geeks For Geeks
  [root @ centos-6 C]# 

作为旁注,一般来说,使用gets()可能不是一个好主意。请查看Linux手册页下面的注释。

永远不要使用gets()。因为如果事先不知道数据就不可能分辨出get()会读取多少个字符,并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。它已被用来打破计算机安全。请改用fgets()。

C中的扫描集-IDC帮帮忙