scanf&fgets&sscanf

1 scanf中的正则表达式:

1.1 定制扫描集

%[abc]、%[a-z]、%[^abc]、%[^a-z]
[ ]内是匹配的字符,^表示求反集,比isdigit()、isalpha()更灵活:

读取含有空格的字符串

#include <stdio.h>
int main()
{
    char str[128];
    scanf( "%[^\n]", str );  //fgets(str,128,stdin);//gets无边界检查,危险函数
    printf( "%s\n", str );
    return 0;
}

2 fgets()

fgets(data, MAXSIZE)
如果输入的字符串小于MAXSIZE,会将'\n'也取出来,实际存储的有效字符为MAXSIZE-2

#include<stdio.h>
#include<string.h>
#define DATASIZE 10
int main()
{
        char data[DATASIZE]={};
        char *ret=NULL;
        ret = fgets(data, DATASIZE, stdin);
        if (ret)
        {
                char *get_enter;
                get_enter = strchr(data, '\n');
                if (get_enter)  //get_enter不为NULL
                        *get_enter = '\0';
                else
                        while(getchar() != '\n');
        }
}

2 sscanf

与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,sscanf以固定字符串为输入源。 
int sscanf(const char *str, const char *format, ...);
格式:
{%[*] [width] [{h | l | I64 | L}] type} 
[*]代表该%段不向结果缓冲区输出(用正则术语来说就是:只匹配不捕获)

#include<stdio.h>
int main()
{
        double t;
        sscanf("temperature: 32.6℃", "temperature: %lf", &t);
        printf("温度为:%lf\n", t);

        return 0;
}
//输出
温度为:32.600000
char res1[5];
char res2[10];
sscanf("Abcd123--++?789efGH", "%5[a-zA-Z]%*[^a-zA-Z]%10[a-zA-Z]",  res1,  res2);
  • %5[a-zA-Z],其中5代表:如果匹配成功的字符数<=5,那就输出实际的字符数;如果匹配成功的字符数>5,那么最多向结果缓冲区输出匹配出的5个字符,第二个%匹配段将从第6个字符开始检查。
  • %*[^a-zA-Z],其中*号代表匹配出的结果不输出,[^a-zA-Z]代表匹配不含a-zA-Z的最长字符串

参考文档:
https://blog.csdn.net/qq_31073871/article/details/90445284

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容