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]】就是匹配换行符前面的所有字符,但是不赋值。

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

#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日

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值