4.1输入和输出
本节必须掌握的知识点:
熟练使用在控制台输入输出
理解格式化字符串
理解转义字符
4.1.1【控制台输出】
使用printf函数可以直接在控制台输出数据。
例:在控制台输出"输出""Hello"数据,使用printf()函数实现。
代码示例CH04_1_1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("输出");
return 0;
}

图4-1-1中,可以看出printf函数既可以输出中文,又可以输出英文。
在第三章3.4节中提到过printf函数,这里详细介绍printf函数。
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
printf()函数的调用格式为:
printf("<格式化字符串>", <参量表>);其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。自己可以动手验证,这里不再例举。
使用printf时注意事项:
1、使用printf时尽量使用英文,因为中文在计算机的世界里是一个很复杂的问题,涉及到编码问题。
2、编写printf()函数时,注意小括号内的内容,小括号内的内容是参数列表;其次注意双引号,双引号内的内容是格式化字符串,是显示在控制台窗口的内容;再者"\n","\n"代表换行,看图4-1-1中,"输出"和"Hello"不在同一行里,这是"\n"的作用。如果不写入"\n"输出的结果会很乱,比如,我们在控制台输出"student""school""cool"这几个字符串,如图4-1-2是没有换行的,图4-1-3是换行之后的,经对比可以看出"\n"存在的必要性。
代码示例CH04_1_2
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("student\nschool\ncool");
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("student");
printf("school");
printf("cool");
system("pause");
return 0;
}


【printf函数下格式化字符串】
printf("<格式化字符串>", <参量表>);
1、 格式化规定符
字符 作用%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x,%X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
2、一些特殊规定字符
字符 作用
\n 换行
\f 清屏并换页
\r 回车
\t Tab符
\xhh表示一个ASCII码用16进表示,其中hh是1到2个16进制数。
自己动手完成下面的例题,看不懂没关系,此例题是为了让大家认识这些格式的书写形式。
例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char c=41;
int a = 1;
float f=0.12;
double b=0.11112222333;
char s[20]="hello,www.bcdaren.com";
char *str ="www.bcdaren.com";
printf("a=%d\n",a);
printf("a=%u\n",a);
printf("a=%x\n",a);
printf("a=%o\n",a);
printf("c=%c\n",c);
printf("c=%x\n",c);
printf("f=%f\n",f);
printf("b=%b\n",b);
printf("s=%s\n",s);
printf("*str=%s\n",str);
}
下图是运行后的结果。

4.1.2【控制台输入】
scanf()函数可以在控制台输入数据。scan表示扫描,f是format的首字母,表示格式化,scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。
其调用格式为:
scanf("<格式化字符串>", <地址表>);
地址表是需要读入的所有变量的地址, 而不是变量本身。这与printf()函数完全不同, 要特别注意。各个变量的地址之间同","分开。这么看概念比较模糊,我们编写完下面代码,进入到调试状态下看,会比较清晰。
例:从控制台输入一个整数,并显示这个整数。
代码示例CH04_1_3
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
声明一个int类型的变量【在4.2节中会介绍到变量】
int i;
printf("请输入一个整数:");
scanf("%d",&i);
%d:表示十进制,&:表示取地址符【&符号在第8章指针会详细介绍】
printf("您输入的整数是:%d\n",i);
system("pause");
return 0;
}
在Visual C++中写入代码,按Ctrl+F5,如图4-1-4。

图4-1-4控制台窗口中显示出了"请输入一个整数:" 此时在控制台窗口光标处键入一个整数即可,输入10后点击键盘上的回撤"Enter"键,查看效果如图4-1-5所示。

关闭控制台窗口,在"int i"这一行代码按F9下断点,并调出内存窗口,如图4-1-6所示。

在Watch里Name下输入i,在Memory里Address对应的窗口输入i,并按回撤。

图4-1-7中,当前变量i的值是一个很大的数值,这是由于定义的变量没有初始化,编译器给我们分配了不确定的值,看内存窗口,变量i的内存地址在0x0012FF7C,而0x0012FF7C存储的数据0xCCCCCCCC。【变量初始化问题会在4.2节变量和常量中详细介绍】。
按F10单步执行,输入10,直行完"scanf("%d",&i);"这一行代码。再查看变量i的值,如图4-1-8。

图4-1-8是执行完"scanf("%d",&i);"这一行代码后的界面,我们看到&i对应的值是0x0012FF7C,而0x0012FF7C存储的数据是0xA,转化成10进制是10。所以这就是scanf函数怎么寻找定义的变量。而地址表则是当输入显示多个变量的地址形成的地址表。
注意:使用scanf函数时,变量名前加&符号。
【scanf格式化字符串】
1、格式化规定符
字符 作用%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x,%X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
2、空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。
3、非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
4.1.3【转义字符】
所有的ASCII码都可以用"\"加数字(一般是八进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。【ASCII码表详见附录B】 转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 (蜂鸣,响铃 ) \b 退格(BS) 008 (回退:向后退一格) \f 换页(FF) 012 (换页) \n 换行(LF) 010 (换行,光标到下行行首) \r 回车(CR) 013 (回车,光标到本行行首 ) \t 水平制表(HT) 009 (水平制表 ) \v 垂直制表(VT) 011 (垂直制表) \\ 反斜杠 092 (反斜杠) \? 问号字符 063 (问号 ) \' 单引号字符 039 (单引号) \" 双引号字符 034 (双引号) \0 空字符(NULL) 000 (空字符(NULL),什么都不做 ) \ddd 任意字符 (三位八进制 ) \xhh 任意字符 (二位十六进制 )
这么空白的说概念,肯定认识模糊,我们以例题为例。
例:使用C语言发出2次响铃。
示例代码CH04_1_4
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("\a\a\n");
\a 响铃
system("pause");
return 0;
}

【注:有可能不会发出响铃。因为主板可能缺失蜂鸣器。】
某种环境
下节介绍变量和常量。
练习:
1、 使用printf()函数输出自己的名字。
2、 使用printf()函数,在控制台窗口中输出以下字符串,输出效果如下图所示。
白莲(唐代 陆龟蒙)
素蘤多蒙别艳欺,此花真合在瑶池。
无情有恨何人觉?月晓风清欲堕时。

3、 在介绍scanf()函数时,声明变量i且并没有赋值,查看变量i的内存地址时,内存地址存储的数据为0xCCCCCCCC为什么?如图所示。【思考题】

4、把列出的格式化规定符、转译字符,自己动手做实验理解它们各自的用法。
