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);
|

浙公网安备 33010602011771号