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

364 0
Honkers 2025-5-10 06:08:02 来自手机 | 显示全部楼层 |阅读模式

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

scanf与格式说明符

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

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

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

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

比如:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int number = 0;
  5. printf("input a number: ");
  6. scanf("%d", &number);
  7. printf("number is [%d]\n", number);
  8. return 0;
  9. }
复制代码

需要用户输入一个数字,赋值到变量number中。
运行结果如下:

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

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int number = 0;
  5. printf("input a number: ");
  6. scanf("%*d", &number); // add *
  7. printf("number is [%d]\n", number);
  8. return 0;
  9. }
复制代码

运行结果如下:

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

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char str[100];
  5. printf("input a number: ");
  6. scanf("%[a-zA-Z]", str);
  7. printf("[%s]\n", str);
  8. return 0;
  9. }
复制代码

运行结果如下:

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

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

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char str[100];
  5. printf("input a number: ");
  6. scanf("%5[a-zA-Z]", str); // note 5
  7. printf("[%s]\n", str);
  8. return 0;
  9. }
复制代码

运行结果如下:

只匹配了5个字符

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

  1. scanf("%*[^\n]");
  2. scanf("%*c");
复制代码

总结:

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

编辑于:2022年12月8日

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4012
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行