达内推荐:用户界面-屏幕和键盘(四)
操作方法
- 01
17.9 怎样防止用户向一个内存区域中输人过多的字符? 有两个原因要防止用户向一个内存区域中输入过多的字符:第一,你可能只希望处理固定数目的字符;第二,可能也是更重要的原因,如果用户输入的字符数超过了缓冲区的容量,就会溢出缓冲区并且破坏相邻的内存数据。这种潜在的危险在C指南书籍中常常会被忽略。例如,对于下面的这段代码,如果用户输入的字符超过了50个,那将是很危险的: char bufE50]; scanf(\"%s\",buf); 解决这个问题的办法是在scanf()中指定要读入的字符串的最大长度,即在“%”和“s”之间插入一个数字,例如: \"%50s\"这样,scanf()将最多从用户那里接受50个字符,任何多余的字符都将保留在输入缓冲区中,并且可以被其它的scanf()所获取。 还有一点需要注意,即字符串需要有一个NUL终止符。因此,如果要从用户那里接受50个字符,那么字符串的长度必须是51,即50个字符供真正的字符串数据使用,还有一个字节供NUL终止符使用。 下面的程序测试了这种方法:# include <stdio. h>/* Program to show how to stop the user from typing too many characters in a field.*/int main(){ char str[50]; /* This is larger than you really need * / /* Now, accept only TEN characters from the user. You can test this by typing more than ten characters here and seeing what is printed. */ scanf( \"%10s\", str); /* Print the string, verifying that it is, at most, ten characters. */ printf( \"The output is : %s.\\n\", str) ; return (0) ; 下面是这个程序的一个运行例子。当输入 supercalifragilisticexpialidocious后,程序将输出 supercalif. 17.10 怎样用0补齐一个数字? 要想用0补齐一个数字,可以在格式说明符中的“%”后面插入一个以0开始的数字。可以用具体的例子来清楚地解释这一点: /*Print a five-character integer,padded with zeros.*/ printf(\"%05d\",i);/ * Print a floating point, padded left of the zero out to seven characters. * /printf(\"% 07f\", f);如果你没有在数字前面加上O这个前缀,那么数字将被用空格而不是O来补齐。下面的程序演示了这种技巧:#include <stdio. h>int main (){ int i = 123; printf( \"%d\\n\", i ) ; printf( \" %05d\\n\", i ); printf( \"%07d\\n\", i ); return( 0 );} 它的输出结果为: 123 00123 OO00123 17.11 怎样才能打印出美元一美分值? C语言并没有提供打印美元一美分值的现成功能。然而,这并不是一个难题,编写一个输出货币值的函数是非常容易的。当你编写了一个这样的函数后,你就可以在任何需要它的程序中调用它了。 这样的函数往往既短小又简单,下文中将简单地描述它的工作方式。在本书中,这个函数被分解成几个较小的容易编写的程序段,因而很容易理解。把一个程序分解为较小的程序段的原因在第11章中已经介绍过了。 这个函数需要使用一些标准C函数,因此你需要包含一些相应的头文件。在任何使用这个函数的程序的开头,你都应该确保包含以下这些头文件:#tinclude <stdio. h>#include <stdlib. h># include <math. h># include <string. h> 包含了所需的头文件后,你就可以创建一个接受美元值并按带逗号的形式打印该值的函数: void PrintDollars( double Dollars ){ char buf[20]; int l , a; sprintf( buf, \" %olf\", Dollars ); l = strchr( buf, \'.\') - buf; for(a= (Dollars<0.0); a<1; ++a) printf( \"%c\", buf[a]) ; if(( ( ( l - a ) % 3) == 1 )&&(a !=l - 1 ) ) printf( \" ,\" ) ; } 你可能习惯于用浮点数来表示实数,这是很平常的。然而,浮点数通常不适合于金融工作,因为它有较大程度的不准确性,例如舍入错误。双精度类型的准确度比浮点数高得多,因此它更适合于真正的数字工作。 只要写一个把整数值传递给该函数的程序,你就可以很方便地测试该函数。然而,该函数还不能打印小数或“零头”,为此,还要专门编写一个完成这项工作的函数:void PrintCents ( double Cents){ char buf[10 ]; sprintf( buf, \"%-. 02f\" , Cents ); printf(\"%s\\n\" , bur + 1 + (Cents <= 0) ); 上述函数接受一个小数值并按正确的格式打印该值。同样,只要编写一个把小数值传递给该函数的程序,你就可以测试该函数了。 现在你已经有了两个函数:一个能打印货币值的美元部分(整数部分),另一个能打印货币值的美分部分(小数部分)。你当然不希望先把一个数分解成两部分,然后再分别调用这两个函数!但是,你可以编写一个函数,用它来接受货币值并把该值分解成美元和美分两部分,然后再调用已有的另外两个函数。这个函数如下所示:void DollarsAndCents ( double Amount ){ double Dollars = Amount >= 0.0 ? floor( Amount ) : ceil(Amount) ; double Cents = Amount - (double) Dollars; if ( Dollars < 0.0 ) printf( \"-\" ); printf( \" $\" ); PrintDollars ( Dollars ) ; PrintCents ( Cents ) ;} 这就是所要的函数! DollarsAndCents()函数接受一个实数值(double类型),并按美元一美分的格式把该值打印到屏幕上。如果你要测试一下这个函数,你可以编写一个main()函数,让它去打印多个美元一美分值。下面就是这样的一个函数: int main() { double num= . 0123456789; int a ; for(a = 0; a<12; ++a ) { DollarsAndCents( num ); num *= 10.0; } return( 0 );} 它的输出结果为: $O.01 $O.12 $1.23 $12.35 $123.46 $1,234.57 $12,345.68 $123,456.79 $1,234,567.89 $12,345,678.90 $123,456,789.OO $1,234,567,890.OO 如果你想按其它的形式打印货币值,你可以很方便地修改这个程序,使其按其它格式打印数字。 以上就是今天我们要为大家分享的有关用户界面-屏幕和键盘(四)的内容,相信能够帮助到大家。