当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > C语言scanf函数用法

C语言scanf函数用法 时间:2019-05-23      来源:华清远见

代码是写不完的,函数也不可能全部掌握,毕竟一个项目也不可能把所有的函数用一遍,但是工作当中的项目都有一个共同点,就是像上面这样,至少会有一个输入,也至少会有一个输出,中间的黑盒子是用户不需要关系的,那么作为工程师我们做的就是实现这个黑盒子,但是要实现这个黑盒子,那么我们必须明确我们的输入是什么,换言之就是明确用户的需求,哈哈,说了这么一大堆,其实就是引入一个可以用来提供用户输入的函数接口scanf而已。

概述

当我们刚开始C学习编程的时候,可能第一个代码是printf,但是下一个代码可能就会用到scanf了,因为在我们还不明白fgets,fread,read……等一系列其他的函数接口的时候,scanf就比较有用了,可以满足我们大多数的输入操作请求。

在Ubuntu下man scanf,你会看到如下内容

 scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf - input format conversion

 SYNOPSIS

        #include <stdio.h>

        int scanf(const char *format, ...);

我们首先从基本的用法入手来看scanf函数:那么什么是基本用法呢?

就是认识函数接口的三要素: 功能,参数,返回值。

功能:格式化输入,====>依据你的输入存放到指定的变量当中

参数:注意类型是 char *format, 再除以参数 …  是可变参数

 这个解释有两点需要注意:

1、char *format指针,对应一个的字符串,底层实现是字符串解析

            2、参数是可变的,至少一个,那么也阔以同时输入多个,且必须是地址

            3、在终端上的输入格式需要和char *format的格式一样

返回值:

成功:正确按指定格式输入变量的个数;,小于等于最大的输入项个数

   失败:返回0

 

一般用法:

scanf()函数的一般格式为:scanf("格式字符串",输入项首地址表)

scanf的格式控制的一般形式为:%[宽度]类型字符

"类型字符":

 d -- 输入十进制整数 、o -- 输入八进制整数 、x -- 输入十六进制整数 、u -- 输入无符号十进制整数 f或e -- 输入实型数(用小数形式或指数形式) 、c -- 输入单个字符 、s -- 输入字符串 

scanf("输入控制符", 输入参数);

功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。

测试代码1: 数值型和字符型数据的输入

 

#include<stdio.h>

 

int main(int argc, const char *argv[])

{

    int x;

char ch;

 

    printf("please input a number:");

    scanf("%d",&x);   //&x 表示变量x 的地址,&是取地址符

printf("x = %d.\n",x);

 

printf("please input a char:");

    scanf("%c",&ch);   

printf("ch = %c.\n",ch);

 

    return 0;

}

~      

测试记录:

linux@ubuntu:~$ gcc  test.c 

linux@ubuntu:~$ ./a.out 

please input a number:99

x = 99.

please input a char: a

ch = a.

 

测试代码2:字符串类型数据的输入

 

#include<stdio.h>

 

int main(int argc, const char *argv[])

{

    int x;

    char str[16] = {0}; //数组的大小合理分配 2^n次方分配比较好

 

    printf("please input 1 number:");

    scanf("%d",&x);    //数值型的数据需要取地址                                                                              

 

    printf("please input string :");

    scanf("%s",str);   //注意,这里不需要取地址,str本身就是地址

 

    printf("x = %d.\n",x);

    printf("str :%s.\n",str);

 

    return 0;

}

测试记录:

linux@ubuntu:~$ gcc test.c

linux@ubuntu:~$ ./a.out 

please input 1 number:10

please input string :helloworld

x = 10.

str :helloworld.

 

测试代码3:数字和字符的格式化输入---注意字符串的长度被截取了

 #include<stdio.h>

 

int main(int argc, const char *argv[])

{

     int x;

     char str1[16] = {0};

     printf("please input (eg:10 haha):");

     scanf("%8d %8s",&x,str1);

 

     printf("x=%d str1:%s\n",x,str1);

     return 0;

}                                                                                                                                          

~       

测试记录:

linux@ubuntu:~$ gcc test.c

linux@ubuntu:~$ ./a.out 

please input (eg:10 haha):5 helloworld

x=5 str1:hellowor

 

"宽度"

表示输入读入字符和整型的长度表示截取相应宽度的数字赋给后面列表中的相应变量;其余的自动舍弃。

对于字符串,则可以用来截取对于长度的数据存放到对应的buf当中,其他舍去。

scanf("%2d%3d",&a, &b);如果输入为12345则将12赋给a,将45赋给b;scanf("%2c%3c",&a, &b);如果输入为12345则将'1'赋给a,将'3'赋给b 

scanf("%8s",str1);如果输入为”helloworld”,则将“hellowor”赋值给str1,其他舍弃

测试记录4:数值型数据和字符串数据的混合输入

#include<stdio.h>

 

int main(int argc, const char *argv[])

{

    int retval;

    int x;

    float y;

    char str1[16] = {0},str2[16] = {0};

 

    printf("please input (eg:10 haha 20.1 gaga):");

    retval = scanf("%d %s %f %s",&x,str1,&y,str2);

    printf("retval :%d.\n",retval);                                                                                                            

 

    printf("x = %d.y = %f.\n",x,y);

    printf("str1 :%s\nstr2 :%s.\n",str1,str2);

 

    return 0;

}

测试结果; 在输入的时候一定不要忘记你格式化的那个空格,否则会报错

正常输入:

linux@ubuntu:~$ ./a.out 

please input (eg:10 haha 20.1 gaga):30 GREE 99 hqyj

retval :4.

x = 30.y = 99.000000.

str1 :GREE

str2 :hqyj.

 

测试记录5:典型错误测试实录

 

#include<stdio.h>

 

int main(int argc, const char *argv[])

{

    int retval;

    int x;

    float y;

    char str1[16] = {0},str2[16] = {0};

 

    printf("please input (eg:x = 10 str1 = haha y = 20.1 str2 = gaga):");

    retval = scanf("x = %d str1 = %s y = %f str2 = %s",&x,str1,&y,str2);

    printf("retval :%d.\n",retval);

 

    printf("x = %d.y = %f.\n",x,y);

    printf("str1 :%s\nstr2 :%s.\n",str1,str2);

 

    return 0;                                                                                                                                  

}

错误输入:

linux@ubuntu:~$ gcc test.c

linux@ubuntu:~$ ./a.out 

please input (eg:x = 10 str1 = haha y = 20.1 str2 = gaga):88 haha 99 gaga

retval :0.

x = 0.y = 0.000000.

str1 :

str2 :.

在使用的时候一定要注意输入格式的提示,或者自己在软件层面做容错的处理,否则很容易导致不良的用户体验,你要明白,用户是怎么操作的? 答:随便操作,随意很多问题要在设计的时候就考虑到。

以上是 scanf 的最简单用法,也是最常用、最基本、最重要的用法。

上一篇:typedef和#define的用法与区别

下一篇:const的作用

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部