C语言学习笔记——scanf(%[^n]%c)

C语言学习笔记——scanf(%[^n]%c)

scanf与格式说明符

参考【scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s - cppreference.com】

我们需要看懂的是【%*[^\n]%c】,现在把它分解开分为 【%[^\n]】【%*c】两个部分。

每一个转换说明符的匹配都以百分号【%】开头。

% 后面的星号【*】表示【赋值抑制字符】,表示不需要参数接受scanf函数匹配的结果。

比如:

#include <stdio.h>

int main(void)
{
    
    
    int number = 0;

    printf("input a number: ");
    scanf("%d", &number);

    printf("number is [%d]\n", number);

    return 0;
}

需要用户输入一个数字,赋值到变量number中。
运行结果如下:
在这里插入图片描述

如果我在%后面添加* 变成 %*d 就不会赋值到 number 中

#include <stdio.h>

int main(void)
{
    
    
    int number = 0;

    printf("input a number: ");
    scanf("%*d", &number);  // add *

    printf("number is [%d]\n", number);

    return 0;
}

运行结果如下:

在这里插入图片描述我们会发现,用户输入的数字无法赋值给变量 number 。【%c】的意思是匹配一个字符(%c 是匹配字符),但不把它赋值给变量。然后【%[^\n]】是什么意思呢?\n 就是换行符。中括号[ ] 代表集合的意思,没错就是你高中数学的第一课集合。如果集合的首字符是 ^ 表示匹配不在集合中的字符。(高中学过的补集)集合中的内容还可以是范围比如:[1-9] 、[a-z]

#include <stdio.h>

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

    printf("input a number: ");
    scanf("%[a-zA-Z]", str);

    printf("[%s]\n", str);

    return 0;
}

运行结果如下:
在这里插入图片描述

综上,【%*[^\n]】就是匹配换行符前面的所有字符,但是不赋值。

扫描二维码关注公众号,回复: 16808921 查看本文章

%后面还可以加数字,表示匹配多少个字符。

#include <stdio.h>

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

    printf("input a number: ");
    scanf("%5[a-zA-Z]", str); // note 5

    printf("[%s]\n", str);

    return 0;
}

运行结果如下:
在这里插入图片描述

只匹配了5个字符

如果 %*[^\n] 匹配不到字符,后面的 %*c 也不会匹配。所以一定要吸收掉换行符,就要把这两句拆开。

scanf("%*[^\n]");
scanf("%*c");

总结:

%[^\n]这个通配符的意思就是跳过所有字符 直到换行符为止。
^for (i=0;i<2;i++) fscanf(fin,"%
[^\n]%c"); 跳过2行。
%
是“跳过”
[^\n] 字符串的分隔符是"\n", 中括号里可以写 分隔符 表
%*[^\n] 跳过 \n 前的所有字符串。
%*c 是“跳过”行尾 的 换行符。

编辑于:2022年12月8日

猜你喜欢

转载自blog.csdn.net/weixin_49796643/article/details/128241206