提示:本文参考书为《C语言程序设计》第四版,苏小红编著。
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、单个字符的输入/输出
1.字符常量
字符常量是用单引号括起来的一个字符,但不适用于某些控制字符(如回车符、换行符等)。
例如:'3'表示一个数字字符,而3则表示一个整数数值
转义字符:以反斜线( \ )开头的字符序列来描述特定的控制字符。
常见的转义字符见下表
字符 | 含义 |
---|---|
‘ \n ’ | 换行 |
‘ \r ’ | 回车(不换行) |
‘ \0 ’ | 空字符,通常用作字符串结束标志 |
‘ \t ’ | 水平制表(相当于按了一下tab键) |
‘ \v ’ | 垂直制表 |
‘ \b ’ | 退格 |
‘ \f ’ | 走纸换页 |
‘ \ " ’ | 一个双引号 |
‘ \ ‘ ’ | 一个单引号 |
‘ \ \ ’ | 一个反斜线 |
‘ \? ’ | 问号 |
‘ \ddd ’ | 1到3位八进制ASCⅡ码值所代表的字符 |
‘ \xhh ’ | 1到2位十六进制ASCⅡ码值所代表的字符 |
字符在内存中存储的是对应的ASCⅡ码的二进制值(就是一个整型数,可作算术运算,但与整型数不同的是char型数据只占1个字节)
小写英文字母ASCⅡ码值比相应的大写字母字母ASCⅡ码值大32。
2.字符的输入/输出
getchar()
和putchat()
是C标准函数库中专门的字符输入/输出函数。
形式为:变量名 = getchar()
和putchar(变量名);
//大写字母转换成小写字母
#include<stdio.h>
int main(void)
{
char ch;
printf("Press a key and then press Enter:");
ch = getchar();
ch = ch + 32;
putchar(ch);
putchar('\n');
return 0;
}
//程序运行结果
Press a key and then press Enter:A
a
也可以用 printf("%c,%d\n",ch,ch);输出
变量的值。这里%d输出的是十进制整型格式就是说输出的是它的ASCⅡ码值。
#include <stdio.h>
int main()
{
char ch;
printf("Press a key and then press Enter:");
ch=getchar();
ch=ch+32;
printf("%c,%d\n",ch,ch);
return 0;
}
//运行这个程序,程序的输出结果是:
Press a key and then press Enter: b↙
?, -126
为什么会输出这样的结果?如何避免?
b的ASCⅡ码值为98 ,加上32后为130,char型数据占1个字节,有符号型char的取值范围是-128~127,对应的二进制是00000000~11111111,130的二进制表示为1000 0010,最高为1,char类型会将1000 0010看成是一个负数,补码为1000 0010的负数为-126,所以会输出-126。
3.用getchar()输入数据存在的问题
函数getchar()的作用是从键盘读字符。当程序调用getchar()时,程序就等待用户按键,用户从键盘输入的字符会被首先放在输入缓冲区中,直到用户按下回车键为止(回车符也会被放到输入缓冲区中)。当用户键入回车后,getchar()才开始读取字符,并且每次调用直读取一个字符,其返回值是用户输入的字符的ASCⅡ码,若遇到文件结尾(End-Of-File),则返回-1,且将用户输入的字符回显到屏幕上。如果用户在按回车之前输入了多个字符,那么其他字符会继续留在输入缓存区中,等待后续getchar()函数调用来读取,即后续的getchar()调用直接从缓冲区中读取字符,直到缓冲区中的字符(包括回车)全部读取完后,才会等待用户按键,只要缓冲区中有字符就不会等待用户的按键操作。
为什么getchar()要读到一个回车符或文件结束符EOF才进行一次处理操作呢?
为什么getchar()以行(而非字符)为单位读取字符呢?
*实际是按文件的方式读取字符
*文件一般都是以行为单位的
有时getchar()也可能返回负值
char ch; ch = getchar();
这时返回值是输入的第一个字符的ASCⅡ码值(通常非负)
用int ch; ch = getchar();
解决返回值出现负数的问题
//例
#include <stdio.h>
int main()
{
char ch1, ch2;
ch1 = getchar();
printf("ch1=%c\n", ch1);
ch2 = getchar();
printf("ch2=%c\n", ch2);
return 0;
}
二、数据的格式化屏幕输出
1.函数printf()的一般形式
printf("格式控制字符串");
printf("格式控制字符串",输出值参数表);
格式控制字符串包括两部分:格式转换说明和需原样输出的普通字符。
函数printf()的格式转换说明见下图:
//输入一个大写字母将其转换成小写字母,并和相应的十进制ASCⅡ码值显示到屏幕上
#include <stdio.h>
int main (void)
{
char ch;
printf ("Press a key and then press Enter:");
ch = getchar ();
ch = ch + 32;
printf ("%c, %d\n", ch, ch);
return 0;
}
//程序运行结果如下:
Press a key and then press Enter:B
b, 98
2.函数printf()中的格式修饰符
在函数printf()的格式说明中还可在%和格式符中间插入下图所示的格式修饰符,用于对输出格式进行微调。
//使用const常量定义圆周率,编程从键盘输入圆的半径r,计算并输出圆的周长和面积。
#include <stdio.h>
int main (void)
{
const double pi = 3.14159;
double r,circum,area;
printf ("Input r:");
scanf ("%lf", &r);
circum = 2 * pi * r;
area = pi * r * r;
printf ("printf WITHOUT width or precision specifications: \n");
printf ("circumference = %f, area = %f\n", circum, area);
printf ("printf WITH width and precision specifications: \n");
printf ("circumference = %7.2f, area = %7.2f \n", circum, area);
//%7.2f表示输出数据所占宽域为7就是占7个字符宽度(小数点也占1个字符),显示精度为2就是保留两位小数.
return 0;
}
//程序运行结果如下:
Input r:5.3
printf WITHOUT width or precision specifications: circumference = 33.300854, area = 88.247263
printf WITH width and precision specifications: circumference = 33.30, area = 88.25
三、数据的格式化键盘输入
1.函数scanf()的一般形式
scanf(“格式控制字符串”,参数地址表);
函数sancf()的格式转换说明符见下图:
2.函数scanf()的格式修饰符
与printf()类似,sancf()的%和格式符中间也可插入下图所示的格式修饰符。
- 在用函数scanf()输入数值型数据时,遇到以下几种情况都认为数据输入结束:
- 遇空格符、回车符、制表符(Tab);
- 达到输人域宽;
- 遇非法字符输入。
- 常见错误:
- scanf(“%7
.2
f”, &a); - scanf(“%f”,
a
); - scanf(“%f
\n
”, &a);
//问题:修改这个程序,使用户可以以任意字符(回车、空格、制表符、逗号、其他)作为分隔符输入数据
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
//%d %d"中间的空格改为”%*c
注意,如果函数scanf()的格式控制字符串中存在除格式说明符以外的其他字符,那么这些字符必须在输入数据时由用户从键盘原样输入。
例子见书47页例4.4
3.格式符%f与%lf
- 调用scanf()输入数据时,通过地址指向变量
- %f告诉编译器scanf()在该地址存储一个float型数。
- %lf告诉编译器scanf()在该地址存储一个double型数。
- 调用printf()输出数据时
- 编译器将float参数自动转换为double类型。
- printf()无法区分float和double。
4.%c输入字符时存在的问题
#include <stdio.h>
int main ()
{
int a;
char b;
float c;
printf ("Please input an integer:");
scanf ("%d", &a);
printf ("integer: %d\n", a);
printf ("Please input a character:");
scanf ("%c", &b);
printf ("character:%c\n", b);
printf ("Please input a float number:");
scanf ("%f", &c) ;
printf("float:%f \n", c);
return 0;
}
//希望得到的结果:
Please input an integer:12
integer: 12
Please input a character:a
character:a
Please input a float number:3.5
float:3.500000
//实际得到的结果:
Please input an integer:12
integer: 12
Please input a character:character:
Please input a float number:3.5
float:3.500000
造成这种结果的原因是因为sancf()函数的格式转换符%c表示输入一个字符,空白字符(包括空格、回车、制表符)也作为有效字符输入。所以这里是读取了输入12后的回车键输出了。
解决方法有两种:
//第一种:在scanf()前加入getchar()将回车读走
#include <stdio.h>
int main ()
{
int a;
char b;
float c;
printf ("Please input an integer:");
scanf ("%d", &a);
printf ("integer: %d\n", a);
printf ("Please input a character:");
getchar();
scanf ("%c", &b);
printf ("character:%c\n", b);
printf ("Please input a float number:");
scanf ("%f", &c) ;
printf("float:%f \n", c);
return 0;
}
//程序运行结果:
Please input an integer:12
integer: 12
Please input a character:a
character:a
Please input a float number:3.5
float:3.500000
重要第二种:在scanf(“%c”,&b);这条语句的%c前加入一个空格忽略缓冲区后的空白字符。