C Program Ⅰ 字符

1.单字符I/O : getchar() 和 putchar()

getchar() 和 putchar ()每次只能输入和输出一个字符。

ANSI C 将 stdio.h 头文件与getchar() 和 putchar()相关联,这就是为什么程序中将该文件包含在内的原因。而且,getchar() 和 putchar() 不是真正的函数,而是定义为预处理器宏。

1.getchar() 与 scanf() 的区分与混用

在缓冲输入时需要按下Enter键,这一动作还传输一个程序必须处理的换行符。而getchar() 读取每个字符,包括空格,制表符和换行符;但是 scanf() 在在读取数字时会跳过空格,制表符和换行符。举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>

void display(char cr, int lines, int width);

int main(){
int ch;
int rows,cols;
printf("Enter a character and a integers:\n");
while((ch = getchar()) != '\n'){
scanf("%d %d",&rows,&cols);
display(ch,rows,cols);
printf("Enter anthor character and a integers:\n");
printf("Enter a newline to quit.\n ");
}
printf("Bye\n");
return 0;
}

void display(char cr,int lines,int width){
int row,col;
for(row = 1; row <= lines; row++){
for(col = 1; col <= width; col++){
putchar(cr);
}
printf("\n");
}
}

运行结果:

程序会在输入之后,没有做出其他输入响应之前就结束了,原因是紧跟在输入3之后的那个换行符。

scanf()函数将该换行符留在输入队列中,与scanf()不同,getchar() 并不跳过换行符。所以在循环的下一周期,再有机会输入任何其他内容之前,这一换行符由getchar()读出,然后将其赋值为ch,而ch为换行符才是结束循环的条件。

改善程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>

void display(char cr, int lines, int width);

int main(){
int ch;
int rows,cols;
printf("Enter a character and a integers:\n");
while((ch = getchar()) != '\n'){
if(scanf("%d %d",&rows,&cols) != 2)
break;
display(ch,rows,cols);
while(getchar() != '\n')
continue;
printf("Enter anthor character and a integers:\n");
printf("Enter a newline to quit.\n ");
}
printf("Bye\n");
return 0;
}

void display(char cr,int lines,int width){
int row,col;
for(row = 1; row <= lines; row++){
for(col = 1; col <= width; col++){
putchar(cr);
}
printf("\n");
}
}

运行结果:

程序跳过了一个输入周期中输入的最后一个数字与下一行开始处输入的字符之间的所有换行符和空格。

2.输入流和数字

1
is 28 12.4

在我们眼中,这就像是一个由字符、整数和浮点数组成的字符串。但是对 C程序而言,这是一个字节流。第1个字节是字母i的字符编码,第2个字节是字母s的字符编码,第3个字节是空格字符的字符编码,第4个字节是数字2的字符编码,等等。所以,如果get_long()函数处理这一行输入,第1个字符是非数字,那么整行输入都会被丢弃,包括其中的数字,因为这些数字只是该输入行中的其他字符:

1
2
while ((ch = getchar()) != '\n')
putchar(ch); // 处理错误的输入

虽然输入流由字符组成,但是也可以设置scanf()函数把它们转换成数值。例如,考虑下面的输入:

1
42

如果在scanf()函数中使用%c转换说明,它只会读取字符4并将其储存在char类型的变量中。如果使用%s转换说明,“它会读取字符4和字符2这两个字符,并将其储存在字符数组中。如果使用%d转换说明,scanf()同样会读取两个字符,但是随后会计算出它们对应的整数值:4×10+2,即42,然后将表示该整数的二进制数储存在 int 类型的变量中。如果使用%f 转换说明,scanf()也会读取两个字符,计算出它们对应的数值42.0,用内部的浮点表示法表示该值,并将结果储存在float类型的变量中。
简而言之,输入由字符组成,但是scanf()可以把输入转换成整数值或浮点数值。使用转换说明(如%d或%f)限制了可接受输入的字符类型,而getchar()和使用%c的scanf()接受所有的字符。

0%