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日