【C语言】printf函数和scanf函数典型例子
2015-07-05 17:13
411 查看
<span style="font-size:18px;">#include <stdio.h> void main() { int i; char c; for(i=0; i<5; ++i) { scanf("%d",&c); printf("%d ",i); } printf("\n"); }</span>
表面上,这个程序从标准输入设备读入5个数,在标准输出设备上写5个数:0 1 2 3 4 。
实际上,这个程序并不一定得到上面的结果。例如在某个编译器上,它的输出是:0 0 0 0 0 1 2 3 4 。
问题的关键在于,这里c被声明为char类型,而不是int类型。当程序要求scanf读入一个整数,应该传递给它一个指向整数的指针。而程序中scanf函数得到的却是一个指向字符的指针,scanf函数并不能分辨这种情况,它只是将指向这个字符的指针作为指向整数的指针而接受,并且在指针指向的位置存储一个整数。因为整数所占的存储空间要大于字符所占的存储空间,所以字符附近的内存将被覆盖。
字符c附近的内存中存储的内容是由编译器决定的,本例中它存放的是整数i的低端部分。因此,每次读入一个数值到c时,都会将i的低端部分覆盖为0,而i的高端部分本来就是0,相当于i每次都被重新设置为0,循环将一直进行。当到达文件的结束位置后,scanf函数不再试图读入新的数值到c。这时,i才可以正常地递增,最后终止循环。
相关文章推荐
- C语言-共用体
- C++11初探
- 【C++】通用单链表
- c++ const 类型转化初始化
- 【C/C++学习笔记】memmove()、memcpy()、memccpy()、strcpy()函数整理
- C++一些注意事项
- C语言程序的gcc翻译步骤
- 让c++ 函数返回一个数组
- LRU Cache的C++实现
- 为什么C++编译器不能支持对模板的分离式编译
- Karatsuba 乘法
- c++11特性
- C++中引用(&)的用法和应用实例
- C语言 位移 速度 时间 Demo
- C语言SQLite3基本操作Demo
- 从一道题谈C++中构造函数调用构造函数
- 八皇后问题(C语言版本)
- 栈的C++实现
- C++程序员拼命工作却不顾身体,是不值得的!
- C/C++中static,const,inline三种关键字详细总结