scanf函数之扫描集

  %[]是scanf函数不常用到的格式字符——扫描集(scanset),它的用法很简单,但却能巧妙地解决一些输入问题。(由于书籍里和网上对此格式字符的介绍很少且篇幅较小,本文可能会有些许错误,请读者勘误)

引入

  介绍扫描集用法前,先明确下面三点:

    1.扫描集用于赋值给字符型变量,包括字符串、字符数组。(不建议使用单个字符变量)

    2.scanf函数以空白字符(空格符、制表符、回车符)结束对变量的赋值。

    3.所有变量都已赋值的情况下,回车是对scanf函数的结束,即继续执行下面的命令。

  以下给出示例来解释2、3点。

1 char str1[5] , str2[5]; 2 3 puts("输入:"); 4 scanf("%s%s",str1,str2); 5 6 puts("输出:"); 7 printf("str1 = %s\nstr2 = %s",str1,str2);

  屏幕结果如下:

/* 使用空格符结束对变量的赋值 */ 输入: abc def 输出: str1 = abc str2 = def /* 使用回车符结束对变量的赋值 */ 输入: abc def 输出: str1 = abc str2 = def

  由上述示例可知,scanf函数的流程(只描述第二个输入)是:将输入的abc赋值给str1 -> 由于后面存在赋值的变量,输入的回车符作为结束对变量str1赋值的标志 -> 将输入的def赋值个str2 -> 由于后面无需要赋值的变量,回车符作为结束输入的标志

  上述示例也引出了两个问题:

    1.若想将空白字符赋值给变量怎么办?

    2.能否使用其他字符作为结束对变量的赋值?

  同时,也引出第三个问题:

    3.怎么只读取特定字符呢?

用法

  此时,扫描集就能解决上述三个问题,以下是它的两个格式,其中string为任意字符:

%[string] // 只读取包含在[]中的字符 %[^string] // 读取除[]中字符以外的字符,^为取反的意思

  下面给出示例及屏幕结果,示例中省略变量声明:

1 /* 第一个格式示例 */ 2 puts("输入:"); 3 scanf("%[abc]",str); // 除abc三个字符外,其他字符均会结束对变量的赋值 4 5 puts("输出:"); 6 printf("str = %s",str);

 

输入: abcdef 输出: str = abc

  可以看到,scanf函数只读取了abc,这里d作为结束对变量str赋值的标志,后面的输入被忽略。

1 /* 第二个格式示例 */ 2 puts("输入:"); 3 scanf("%[^abc]",str); // abc三个字符均会结束对变量的赋值,其他任意字符都会被赋值给变量 4 5 puts("输出:"); 6 printf("str = %s",str);

 

输入: defabc 输出: str = def

  上述示例,scanf函数将a作为结束对变量str赋值的标志,同样忽略后面的输入。

  若是想代表所有字母或数字,不必要输入所有的字母和数字,只需使用破折号来代表一定的范围即可,例如:

    a-z 代表从a到z的26个小写字母

    A-Z 代表从A到Z的26个大写字母

    c-z 代表从c到z的24个小写字母

    0-9 代表从0到9的10个数字

  综合上述的用法,就可解决那三个问题,在这就不给出示例。

后话

  scanf函数对于字符串的输入,存在着许多的问题,所以需要我们注意这些细节性的问题。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/88ddbe33be77bf1972bece4de7983f81.html