7.3.7用个getchar和putchar读/写字符

一、代替scanf、printf的函数

二、getchar函数返回的是什么类型的值?

三、为什么getchar和putchar执行速度快?

四、getchar函数优于scanf函数的地方?

五、while((ch = getchar()) == ' ')这个以下的内容没看懂

C语言还提供了另外一些读/写单个字符的方法。可以使用getchar函数和putchar函数来取代scanf函数和printf函数。

putchar函数用于写单个字符:  putchar(ch);

每次调用getchar函数时,它会读入一个字符并返回。为了保存这个字符,必须使用赋值操作将其存储到变量中:

ch = getchar();/*reads a character and stores it in ch*/

事实上,getchar函数返回的是一个int类型的值而不是char类型的值(原因后面说)。因此如果一个变量用于存储getchar函数读取的字符,其类型设置为int而不是char也不奇怪。和scanf函数一样getchar函数也不会在读取时跳过空白字符。

执行程序时,使用getchar函数和putchar函数(胜于scanf和printf)可以节约时间。getchar函数和putchar函数执行速度快有两个原因。

第一个原因是,这两个函数比scanf和printf函数简单得多,因为scanf和printf是设计用来按不同的格式读/写多种不同类型数据的。第二原因是,为了额外的速度提升,通常getchar函数和putchar函数是作为宏来实现的。

getchar函数还有一个优于scanf函数的地方:因为返回的是读入的字符,所以getchar函数可以应用在多种不同的C语言惯用法中,包括用的搜索字符或跳过所有出现的同一字符的循环中。思考下面这个scanf函数循环,前面我们曾用它来跳过输入行的剩余部分:

do {

  scanf("%c", &ch);

}while (ch != '\n');

用getchar函数重写上述循环,得到下面的代码:

do{

  ch = getchar();

}while (ch!= '\n');

把getchar函数调用移到控制表达式中可以精简循环:

while((ch = getchar()) != '\n');

这个循环读入一个字符,把它存储在变量ch中,然后测试变量ch是否不是换行符。如果测试结果为真,那么执行循环体(循环体实际为空),接着再次测试循环条件,从而引发读入新的字符。实际上我们并不需要变量ch,可以把getchar函数的返回值与换行符进行比较;

【惯用法】

while (getchar() != '\n'); /*skips rest of line跳过剩余的行*/

这个循环时非常注明c语言惯用法,虽然这种用法的含义是十分隐晦的,但是值得学习。

getchar函数对于搜索字符的循环和跳过字符的循环都很有用。思考下面这个利用getchar函数跳过不定数量的空格字符的语句:

【惯用法】

while((ch = getchar()) == ' '); /*skips blanks*/

当循环终止时,变量ch将包含getchar函数遇到的第一个非空白字符。

如果在同一个程序中混合使用getchar函数和scanf函数,请一定要注意。scanf函数倾向于遗留下它'扫视'过但未读取的字符(包括换行符)。思考一下,如果试图先读入数再读入字符的话,下面的程序段会发生什么:

printf("Enter an integer: ");/*integer整数*/

scanf("%d", &i);

printf("Enter a command: "); /*command*/

command = getchar();

在读入i的同时,scanf函数调用将会留下没有消耗掉的任意字符,包括(但不限于)换行符。getchar函数随后将取回第一个剩余字符,但这不是我们希望的。

 

-----------

char ch; int len = 0;

printf("Enter a message: ");

ch = getchar();

while( ch != '\n'){

len++; ch = getchar();

}

printf("Your message was %d character long. \n", len);

-------------

int len = 0;

pritnf("Enter a message: ");

while (getchar() != '\n')

  len++;

printf("message was %d character long. \n", len);

 

 
posted @ 2021-04-13 22:16  Sai佐为  阅读(462)  评论(0)    收藏  举报