- 浏览: 283164 次
- 性别:
文章分类
最新评论
下面是对printf()和scanf()函数的说明:
一.printf()函数
1.参数传递
参数传递的机制随实现不同而不同,下面是参数传递在系统中的工作原理.函数调用如下:
printf("%ld %ld %ld %ld",n1,n2,n3,n4);
//设n1为float型 n2为double型 n3,n4为long型
该调用告诉计算机把变量n1,n2,n3,n4的值传递给计算机,计算机把它们放置到被称为对战(stack)的一块内存区域中来实现。计算机根据变量的类型而非转换说明符(%ld)把这些值放置到堆栈中.所以,n1在堆栈中占用8个字节(float被转换成了double)。同样,n2占用8个字节,而n3和n4则分别占用4个字节。让后控制转移到printf()函数。
该函数从堆栈把值都出来,但在读取时,他根据转换说明符去读取。%ld说明符指出,printf()应该读取4个字节,所以printf()在堆栈中读取前4个字节作为他的第一个值。这就是n1的前半部分,他被解释成一个长整数(long integer).下一个%ld说明符在读取4个字节;这就是n1的前半部分,他被解释成第二个长整型(long integer).同样,%ld的第三个和第四个实例使得n2的前半部分和后半部分被读出,并被解释成两个长整型(long integer)。所以,虽然n3和n4的说明符都正确,但是printf()仍然读取了错误的字节。
2.printf()的返回值
返回所打印的字符的数目,如果有错误输出,那么printf()会返回一个负数(printf()的一些老版会有不同的返回值)
二.scanf()函数
此函数可以读取各式各样的数据。它把输入的字符串转换成各种形式:整数,浮点数,字符和C的字符串。
1.使用scanf()函数
scanf()函数使用空格(换行,制表符和空格)来决定怎样把输入分成几个字段。他一次把转换说明与字段相匹配,并跳过他们之间的空格。
例:
int age;
int assets;
scanf("%d %f",&age,&assets);
我们可以分两行进行输入。同样,也可以分一行或5行输入,只要在每个输入项目之间至少键入一个换行符,空格或者制表符。唯一例外的就是%c说明,即使下一个字符是空白字符,它也会读取那个字符。
2.从scanf()的角度看输入
我们在仔细地研究scanf怎样读取输入,
假顶您使用了一个%d说明符来读取一个整数。scanf()函数开始每次读取一个输入字符,它跳过空白字符(空格,制表符和换行符)直到遇到一个非空白字符。因为他试图读取一个整数,所以scanf()期望发现一个数字字符或者一个符号(+或者-).
如果遇到了一个非数字的字符,他就得出结论:已读到了整数的尾部。scanf()把这个非数字字符放回输入缓冲区。这就意味着当程序下一次开始读取输入时,它将从前面被放弃的那个非数字字符 开始。最后,scanf()计算读取到的数字的相应数组,并将该值放到指定的变量中。
如果第一个非空白字符不是数字,将会发生什么呢?比如说,是A而非一个数字?这时scanf()会停在那里,并把A(或者不管什么)放回输入。没有把任何值赋给指定的变量,程序下一次读取输入 时,它就在A处重新开始。如果程序中只有%d这个说明符,scanf()永远也不会越过那个A去读下一个。而且,如果您使用带有多个说明符的scanf()语句,ANSI C 要求函数在第一个出错的 地方停止读入输入。
如果使用%s说明符,那么空白字符(空格,回车,制表符)以外的所有字符都是可接受的,所以scanf()跳过空白字符直到遇到第一个非空白字符,然后保存再次遇到空白字符之前的所有非空白字符.这就意味着%s 是scanf()读取一个单词,也就是说,一个不包含空白字符的字符串。如果使用字段宽度,scanf()在字段的结尾或者第一个空白字符处停止。不能通过字段宽度使得scanf()用一个%s说明符读取多于一个字的输入。最后一点:当scanf()把字符串放在一个指定的数值中,他添加终止的'\0'使得数组内容成为一个C字符串。
如果使用%c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或者换行符赋给指定的变量;不会跳过空白字符。
3.scanf()的返回值
返回成功读入的项目的个数。如果他没有读取任何项目(当它期望一个数字而您却键入一个非数字字符串时就会发生这种情况),scanf()会返回值0.当他检测到“文件结尾”是,他返回EOF(EOF是在文件stdio.h中定义的特殊值。一般#define指令把EOF的值定义为-1)
发表评论
-
C中结构体
2013-01-09 15:47 616把结构体保存到文件中,用fwrite()函数: fwrite ... -
关于socket编程中基本函数介绍
2012-11-03 13:57 1032源自:http://blog.sina.com.cn/s/bl ... -
C中需要注意的小问题
2012-09-27 08:59 8131.在用scanf()函数读入double型数值时要用%lf的 ... -
指针和多维数组
2011-12-26 10:03 813摘自:《C primer plus》 指针和多位数组 ... -
C中<ctype.h>库
2011-12-19 20:21 718标准库<ctype.h> 1 ... -
C中double类型数据的输入和输出
2011-12-19 10:04 12393double a; scanf(" ... -
C中转义序列及其含义
2011-12-15 20:27 974转义序列: 序列 ... -
C中各数据类型取值范围
2011-12-15 19:31 13891.标准头文件<limits.h>中包含了 ... -
C中常用的类型转换函数
2011-12-14 17:34 816源自:http://hi.baidu.com/hao_%BF% ... -
C语言格式化输出系统时间
2011-12-14 17:04 5932源自:http://blog.csdn.net/jiadeli ... -
C中目标代码文件,可执行文件和库
2011-12-14 10:19 1955C编程的基本策略是使用程序将源代码文件转换为可执行 ... -
vs2008下vc的库函数及头文件存放位置
2011-12-13 22:14 4570在写C/C++程序时总会在开头包含一些头文件,如:#inclu ... -
malloc()函数
2011-12-12 17:35 0待写 -
用C写的模拟掷骰子程序
2011-12-12 16:47 2346整理自:《C Primer Plus》第五版 此程序包 ... -
C中字符串的输入输出及相关函数
2011-12-27 21:59 3842//本节内容摘自对Stephen Prata的《C Prime ... -
指针的基本操作以及关于指针的注意事项
2011-12-11 17:42 916一. 指针的基本操作有:赋值(assignment),求值(v ... -
关于*与++的优先级
2011-12-11 16:53 1723C中一元运算符*和++具有相等的优先级,但它们在结合时是从右向 ... -
C中关于数组参数的传递
2011-12-09 11:43 921编写一个对数组进行操作的函数,目的是返回数组内所用元素的和。 ... -
C中有关数组的说明
2011-12-09 11:10 788下面介绍一下关于数组的一些说明: 在数组声明时必须 ... -
C语言中对sizeof()和strlen()的说明
2011-12-09 10:01 11201.sizeof函数 sizeof函数返回表达式所占的内存空 ...
相关推荐
MSP430单片机程序开发中,标准C语言的printf和scanf函数由于其在数据格式化输入输出方面的便利性,经常被使用在开发中。但在嵌入式开发环境中,标准库函数并不总是可以直接使用,因为它们没有直接处理硬件接口的代码...
汇编语言调用C的printf和scanf函数时需要include vcIO.inc但是有时候编译环境没有这个文件。
首先,`printf`和`scanf`是C语言中的标准输入输出函数,它们分别用于格式化输出和输入数据。在标准应用中,这些函数通常是与控制台交互的,但在嵌入式系统中,我们通常没有标准的控制台界面,因此需要重定向这些函数...
在开发过程中,我们经常需要使用标准输入输出函数如printf和scanf,以便进行调试和交互。在PC上,这些函数通常由C运行时库提供,但在嵌入式系统中,由于资源限制,可能需要自定义实现。 本文将详细介绍如何在STM32...
C语言中Printf和Scanf的使用方法详细 _printf()函数_ printf()函数是C语言中的一种格式化输出函数,用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: `printf(...
在C语言中,printf和scanf是两个非常重要的函数,前者用于输出格式化字符串,而后者用于输入格式化字符串。在本文中,我们将深入讲解scanf函数的使用,特别是它的格式控制字符串。 scanf函数的格式控制字符串通常以...
在C/C++编程中,`printf`和`scanf`是两个非常重要的标准输入输出函数,它们可以处理可变数量的参数。理解并实现这样的可变参函数是深入学习C/C++语言的关键步骤之一。本文将详细讲解如何模拟`printf`和`scanf`的功能...
标题中的"uart_c_printf_scanf.zip"表明这是一个关于UART(通用异步收发传输器)在C语言环境中使用printf和scanf函数的示例或教程。UART是一种常见的串行通信接口,广泛应用于嵌入式系统中,用于设备间的通信。在这...
内容包括硬件初始化(汇编),时钟、内存、mmu、串口、led初始化(c语言),代码搬移是从垫脚石搬移到内存,不含从nandflash搬移到内存,功能:点亮led,使用printf+scanf函数调用串口程序打印输出。
C语言中scanf函数是进行数据输入的基础,它来源于C标准库函数,具备强大的输入功能,但在实际使用时若不当心,可能会导致错误或非预期结果。VC++6.0环境下的例子将用于说明在使用scanf函数时常见的问题及其解决方法...
本文主要探讨了C语言中scanf函数的用法,着重指出scanf函数在使用过程中的易错点,并通过例子展示了scanf函数在不同情况下的使用注意事项。 一、 scanf函数的基本用法 scanf函数的基本格式是:scanf (“输入控制符...
例如,在使用scanf函数从键盘接收输入之前,可以通过printf输出提示信息,使用户明确知道需要输入何种数据。不提供提示信息可能会导致用户在执行程序时感到困惑,而添加提示则能增强程序的可操作性和用户体验。 ...
### C语言中printf函数的功能注解 #### 一、引言 在C语言编程中,基本的输入输出功能主要是通过调用标准库函数实现的。其中,`printf`函数是功能强大且常用的输出函数之一。本文将详细介绍`printf`函数的功能,并...
为了使 `printf` 和 `scanf` 能够通过串口输出和输入数据,需要在 `ARC_Retarget.c` 文件中对 `fputc` 和 `fgetc` 函数进行重写,以便它们能够正确地将数据发送到串口或从串口接收数据。 ### 示例代码分析 下面给...
C语言中的scanf函数是最常用的输入函数,但如果使用不当,就会出现错误或得不到预想的结果。因此,了解scanf函数的使用规则和注意事项非常重要。 一、格式说明符和输入项的三对应(类型、个数、顺序) 在scanf函数...
C语言中scanf函数的使用详解 scanf函数是C语言中最常用的一个输入函数,也是C语言中最基本的操作,但其使用格式繁琐、多变,初学者不易掌握。根据以往的教学经验,总结出scanf函数的使用规则、使用中常遇到的问题及...
`scanf`函数是C语言中的输入函数,允许按照指定的格式从标准输入(通常是串口或键盘)读取数据。例如,`scanf("%d %c %f", &intVar, &charVar, &floatVar)`可以从输入流中读取一个整数、一个字符和一个浮点数,并将...
在C语言中,`printf`函数是一个非常重要的输出函数,用于在控制台上打印各种类型的数据。这篇文章详细介绍了`printf`函数的功能以及使用时需要注意的事项,对于理解和掌握C语言的基本输入输出具有指导意义。 首先,...