黑马程序员技术交流社区

标题: scanf函数总结 [打印本页]

作者: 紫荆秋雪    时间: 2015-7-14 21:17
标题: scanf函数总结
本帖最后由 紫荆秋雪 于 2015-7-14 21:33 编辑

------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一、scanf函数小结


1>scanf函数的说明及其注意事

scanf函数说明:

    a. 如果使用这个函数,要包含一个头文件 stdio.h。

    b.scanf函数是一个阻塞式函数:函数执行后,会等待用户的输入,如果用户不输入任何内容,它会一直等待。

scanf函数的作用:

     接收用户从键盘输入的内容。

scanf函数的格式:

     scanf("格式控制符",输入项的地址列表);

     例如:scanf("%d",&a);   其中a是一个变量



2>scanf函数使用注意事项

scanf使用注意事项

      注意:1)如果在输入时,输入了多个空格、回车、Tab都会被系统忽略的。

                 2)如果要获取的内容是多个整数,中间输入了多个空格、回车、Tab都会被系统忽略

       特别注意:当输入是一个字符串时,输入字符串时不能在中间输入空格、回车、Tab,否则之后的字符都不会被输入。



3>scanf函数运行原理:

       1)当用户输入内容后,用户输入的内容会被存放到scanf的输入缓冲区中,然后scanf函数会根据格式控制的字符的要求,从输入缓冲区一次取它想要的内容,如果从缓冲区中取的内容和我们的格式要求一致,则把值存放到变量中如果格式不一致,则不修改变量的值。

       2)如果缓冲区中有内容,则不会提示我们再输入值。


4>关于scanf函数的总结:

     a.如果我们的输入全都是%d类型的,那么无论我们在输入数据时时插入 空格、回车、Tab等其他字符,都会被系统忽略。

     b.如果我们输入的是类型中含有%c类型等混合输入,那么就不能随便的插入 空格、回车、Tab等其他字符,要按照scanf函数的格式来从键盘输入。

例如:

         scanf("%d%c%d",&a,&ch&b);

从键盘输入的格式如下:

        21a34(回车)

        小结:所以一般在混合的scanf函数书写时最好使用如下格式:这样不仅安全而且我们输入时也清楚明了。

建议格式:scanf("%d,%c,%d",&a,&ch,&b);

从键盘输入的格式:21,a,34


         总之在输入时,一定按照scanf的“格式控制符”的格式一 一输入。


示例如下:

实现功能:判断字符串中是否包含某个字符,如果包含,返回其首次出现的位置,否则返回-1

说明:为了使程序更加灵活改进如下:

       1>让用户自己输入 字符串

       2>让用户自己输入要查找 字符

例1
#include <stdio.h>
int chao(char ch[],char key);//子函数的声明
int main()
{
    //定义一个变量
    int s=0;
    //定义一个字符串数组
    //char str[]="asdfghj";这样是一个固定的字符串,这不是我们想要的
    char str[100];
    char c;
    //提示:请输入一个字符串、请输入查找字符
    printf("请输入一个字符串、请输入查找字符,格式为:字符串 字符\n");
    scanf("%s %c",str,&c);
    s=chao(str,c);
    printf("%d\n",s);
}
//定义一个查找字符的函数
int chao(char ch[],char key)
{
    int i=0;
    while(ch!='\0')//用while循环来遍历字符串,知道遇到结束符'\0'
    {
        if(ch==key)//如果在遍历字符串中第一次遇到所要查找的字符,返回该字符的下标
        {
            return i;
        }
        i++;
    }
    return -1;
}
打印如下:
打印图1
asdfg g
4

当找不到的打印如下

打印图2
asdfg j
-1
例2
#include <stdio.h>
int chao(char ch[],char key);//子函数的声明
int main()
{
    //定义一个变量
    int s=0;
    //定义一个字符串数组
    //char str[]="asdfghj";这样是一个固定的字符串,这不是我们想要的
    char str[100];
    char c;
    //提示:请输入一个字符串、请输入查找字符
    printf("请输入一个字符串、请输入查找字符,格式为:字符串 字符\n");
    scanf("%s,%c",str,&c);
    s=chao(str,c);
    printf("%d\n",s);
}
//定义一个查找字符的函数
int chao(char ch[],char key)
{
    int i=0;
    while(ch!='\0')//用while循环来遍历字符串,知道遇到结束符'\0'
    {
        if(ch==key)//如果在遍历字符串中第一次遇到所要查找的字符,返回该字符的下标
        {
            return i;
        }
        i++;
    }
    return -1;
}
打印如下:
打印图3
asdfg,g
-1
注意:

        例1和例2是同一个例题,但是打印出来却是大不同,俩个程序的差别就是在scanf函数的格式不同

例1中的scanf形式为scanf("%s %c",str,&c)而例2中的scanf形式为scanf("%s,%c",str,&c)。scanf("%s,%c",str,&c)形式在上面是我们推荐使用的一个格式但是为什么会出错?这个问题就在于scanf("%s,%c",str,&c)中是%s而不是%d、%c

这是为什么,我个人觉得因为是当输入asdfg,f时,由于在scanf("%s,%c",str,&c)中第一个格式控制符是%s,是输入字符串的所以即使输入中有’,‘但是依然会把’,‘看做是普通字符。

       例1就是巧妙的应用了输入字符串时的特性(输入字符串时中间不能加 空格、回车、Tab,否则后面的字符无法输入),所以在scanf("%s %c",str,&c)不是用逗号来隔开的而是用空格来隔开的。同样你用Tab隔开%s和%c也是可以的。难道就不能用逗号?

       使用逗号来隔开%s和%c的用法:

例3
#include <stdio.h>
int chao(char key,char ch[]);
int main()
{
    //定义一个变量
    int s;
    //定义一个字符串数组
    //char str[]="asdfghj";
    char str[100];
    char c;
    //提示:请输入查找字符、请输入一个字符串
    printf("请输入查找字符、请输入一个字符串,格式为:字符,字符串\n");
    scanf("%c,%s",&c,str);
    s=chao(c,str);
    printf("%d\n",s);
}
//定义一个查找字符的函数
int chao(char key,char ch[])
{
    int i=0;
    while(ch!='\0')//用while循环来遍历字符串,知道遇到结束符'\0'
    {
        if(ch==key)
        {
            return i;//如果在遍历字符串中第一次遇到所要查找的字符,返回该字符的下标
        }
        i++;
    }
    return -1;
}
打印如下:
>可以找到
打印图4
g,asdfg
4
>找不到

打印图5
j,asdfg
-1
>输入格式有误
打印图6
g asdfg
-1
总结:通过对比例2和例3发下,例3使用逗号来隔开%c,%s,scanf("%c,%s",&c,str)可以完成程序要求,例3的成功是因为%c和%s交换了位置。这样为什么可以?

分析:当我们输入a,kjgsdfa时,a存储到了字符区,kjgsdfa存储到了字符串区,所以这样是可以的。

        通过打印图1和打印图3比较可以知道,我们必须按照scanf("%c,%s",&c,str)的格式来输入,是逗号就用逗号,是空格就用空格,这和我们前面的说明是一致的。当然scanf("%c,%s",&c,str)中的','也可以被空格、Tab代替来使用。

建议:当用scanf函数有%c,%d,%s混合的输入时,推荐使用此格式:scanf("%d,%c,%s",&a,&ch,str);

例1.png (105.4 KB, 下载次数: 8)

例1

例1

打印图1.png (1.78 KB, 下载次数: 10)

打印图1

打印图1

打印图2.png (1.78 KB, 下载次数: 8)

打印图2

打印图2

例2.png (137.44 KB, 下载次数: 8)

例2

例2

打印图3.png (1.7 KB, 下载次数: 10)

打印图3

打印图3

例3.png (110.36 KB, 下载次数: 8)

例3

例3

打印图4.png (1.8 KB, 下载次数: 7)

打印图4

打印图4

打印图5.png (1.78 KB, 下载次数: 8)

打印图5

打印图5

打印图6.png (1.73 KB, 下载次数: 8)

打印图6

打印图6

作者: 黑马灬小胖纸    时间: 2015-7-14 23:55
总结的还不错
作者: 禾叶青青    时间: 2015-7-15 00:10
很详细,赞一个
作者: 紫荆秋雪    时间: 2015-7-15 22:40
黑马灬小胖纸 发表于 2015-7-14 23:55
总结的还不错

谢谢,希望多多交流!
作者: 紫荆秋雪    时间: 2015-7-15 22:42
禾叶青青 发表于 2015-7-15 00:10
很详细,赞一个

谢谢,希望以后多多交流!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2