2. scanf()一般格式:
%[*][输入数据宽度][长度]格式类型
%* 与%刚好相反,读取但不赋值给后面的变量,也就是跳过满足条件的字符,其后一定要有新的%语句,否则无法读入
scanf()中的%d不会读入前面的空白符(空格,换行,TAB),当遇到任意空白符就会结束当前读取。故可用空白符作为多个变量读取并赋值的分隔
scanf()中的%c会读取任意字符,而且只读一个
C语言中scanf()输入数据时按回车键后换行字符也会被getchar()或scanf()读取并赋值给变量,比较好的解决方案是用正则表达式:
int i;
char c;
scanf("%d%[^ ^\n]",&i, &c);
同时scanf(“%[^\n]”,str); //以换行符作为字符串输入的结束,可以输入空格
%表示选择后面的条件,%[]是取[]内匹配的字符,而^和后面的字符结合表示取反集,当遇到非集合内的字符时立即终止输入,即遇到^后的字符立即终止输入
更多的scanf常用正则表达式查看
https://www.cnblogs.com/orange1438/archive/2013/05/12/4544958.html#:~:text=scanf%20%28%29%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E4%BD%BF%E7%94%A8.%20%5B%5D%E5%86%85%E6%98%AF%E5%8C%B9%E9%85%8D%E7%9A%84%E5%AD%97%E7%AC%A6%2C%5E%E8%A1%A8%E7%A4%BA%E6%B1%82%E5%8F%8D%E9%9B%86%EF%BC%8C%E5%BD%93%E9%81%87%E5%88%B0%E9%9D%9E%E9%9B%86%E5%90%88%E5%86%85%E7%9A%84%E5%AD%97%E7%AC%A6%E6%97%B6%E7%AB%8B%E5%8D%B3%E7%BB%88%E6%AD%A2%E8%BE%93%E5%85%A5.%201.%20%E8%BE%93%E5%85%A5%E6%8C%87%E5%AE%9A%E8%8C%83%E5%9B%B4%E7%9A%84%E5%B0%8F%E5%86%99%E5%AD%97%E6%AF%8D%EF%BC%8C%E9%81%87%E5%88%B0%E9%9D%9E%E6%B3%95%E5%AD%97%E7%AC%A6%E7%AB%8B%E5%8D%B3%E7%BB%88%E6%AD%A2.%20scanf%20%28%20%22%25,%2Cstr1%29%3B%20printf%20%28%20%22%25s%5Cn%22%20%2Cstr1%29%3B%20%E8%BE%93%E5%85%A5%EF%BC%9Aabc123.%20%E8%BE%93%E5%87%BA%3Aabc.%20%2F%2F%E8%BE%93%E5%85%A5%E5%B8%A6%E7%A9%BA%E6%A0%BC%E7%9A%84%E8%87%AA%E5%AE%9A%E8%8C%83%E5%9B%B4%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.
[a-z]表示a到z字符,而a-z作为一个整体
[z-z ]表示a到z字符和空格字符,a-z是一个整体,空格也是单独一个
printf(“%s”,str)中的%s需要一个指向一个字符串中一个字符的指针,然后从这个字符开始输出,直到遇到’\0’(NULL) ,就会停止输出
注意scanf(“%s”,arr)中的%s是按字节赋值的,而不是按元素赋值,所以如果arr不是字符类型的数组,比如int类型,则四个字母为一个元素。
实际运用
child::c语言 scanf过滤字符