Loading... # c基本输入输出 以下函数可以从键盘获得用户输入: - scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。 - getchar()、getche()、getch():这三个函数都用于输入单个字符。 - gets():获取一行数据,并作为字符串处理。 输出有三个函数,分别作用不同 - printf:标准输出,屏幕上打印 - sprintf:格式化的数据写入字符串中,返回值字符串长度 - fprintf:指定格式输出到文件流中 # 输入函数 ## `getchar()` `getchar()`函数的一般形式为: ```c char ch = getchar(); ``` `getchar()`函数用于从键盘获取一个字符 - 只能读取一个字符 - 该字符赋给字符变量、整型变量、或作为表达式的一部分 - getchar可以用来清空缓冲区(防止读入垃圾数据) ## `getche()` getche() 没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,这是它和 scanf()、getchar() 的最大区别。 > 代码: ```c #include <stdio.h> #include <conio.h> int main() { char c = getche(); printf("c: %c\n", c); return 0; } ``` > 输入示例: ```c @c: @ ``` 输入`@`后,getche() 立即读取完毕,接着继续执行 printf() 将字符输出,所以没有按下回车键程序就运行结束了。 ## `getch()` getch() 也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,这一点和 getche() 相同。getch() 的特别之处是它没有回显,看不到输入的字符。所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符。 > 代码: ``` #include <stdio.h>#include <conio.h>int main(){ char c = getch(); printf("c: %c\n", c); return 0;} ``` 输入`@`后,getch() 会立即读取完毕,接着继续执行 printf() 将字符输出。但是由于 getch() 没有回显,看不到输入的`@`字符,所以控制台上最终显示的内容为`c: @`。 注意: `getche()` 和 `getch()`位于 `conio.h` 头文件中,getche() 并不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。 ## `scanf()` scanf函数的一般形式为: ```c scanf(“格式控制字符串”, 地址表列); ``` 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“**`&`**”后跟变量名组成的。 ### **格式字符串** 格式字符串的一般形式为: ```c %[*][输入数据宽度][长度]类型 ``` 其中有方括号[]的项为任选项。各项的意义如下。 **1) 类型** 表示输入数据的类型,其格式符和意义如下表所示。 | 格式 | 字符意义 | | ------ | -------------------------------- | | %d | 输入十进制整数 | | %o | 输入八进制整数 | | %x | 输入十六进制整数 | | %u | 输入无符号十进制整数 | | %f或%e | 输入实型数(用小数形式或指数形式) | | %c | 输入单个字符 | | %s | 输入字符串 | **2) “\*”符** 用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如: ```c scanf("%d %*d %d",&a,&b); ``` 当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。 **3) 宽度** 用十进制整数指定输入的宽度(即字符数)。例如: ```c scanf("%5d",&a); ``` 输入12345678只把12345赋予变量a,其余部分被截去。又如: ```c scanf("%4d%4d",&a,&b); ``` 输入12345678将把1234赋予a,而把5678赋予b。 **4) 长度** 长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。 使用scanf函数须注意以下几点: 1. **scanf函数中没有精度控制**,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。 2. **scanf中要求给出变量地址,如给出变量名则会出错**。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。 3. **在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔**。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。 4. **在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符**。 > 例如: ```c scanf("%c%c%c",&a,&b,&c); ``` 输入 d、e、f 则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为 def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔 > 如: ```c scanf ("%c %c %c",&a,&b,&c); ``` 则输入时各数据之间可加空格。 **5) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。** 例如: ``` scanf("%d,%d,%d",&a,&b,&c); ``` 其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如: ``` scanf("a=%d,b=%d,c=%d",&a,&b,&c); ``` 则输入应为:a=5,b=6,c=7。 **6) 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。** > 例: ```c #include <stdio.h> int main(void){ int a; printf("input a number\n"); scanf("%d",&a); printf("%ld",a); return 0; } ``` 由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。 > 如改动程序如下 ```c #include <stdio.h> int main(void){ long a; printf("input a long integer\n"); scanf("%ld",&a); printf("%ld",a); return 0; } ``` > 运行结果为: ``` c input a long integer 1234567890 1234567890 ``` 当输入数据改为长整型后,输入输出数据相等。 ### **scanf 类型说明符:** | 类型 | 合格的输入 | 参数的类型 | | ---------------------- | ------------------------------------------------------------ | -------------- | | %c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 | char * | | %d | 十进制整数:数字前面的 + 或 - 号是可选的。 | int * | | %e、%E、%f、%F、%g、%G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4 | float * | | %i | 读入十进制,八进制,十六进制整数 。 | int * | | %o | 八进制整数。 | int * | | %s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 | char * | | %u | 无符号的十进制整数。 | unsigned int * | | %x、%X | 十六进制整数。 | int * | | %p | 读入一个指针 。 | | | %[] | 扫描字符集合 。 | | | %% | 读 % 符号。 | | ## `gets()` `gets())`函数的一般形式为: ```c gets(str); ``` `gets()` 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。 ```c scanf("%s", string);//gets(str);完全可以取代:scanf("%s", string); ``` 注意: 使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。 ### gets() 和 scanf() 的主要区别是: - scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。 - gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。 # 输出函数 ## `printf()` 形式为: ```c printf(“格式控制字符串”, 输出表列); ``` ### 格式字符串 在Turbo C中格式字符串的一般形式为: ```c [标志][输出最小宽度][.精度][长度]类型 ``` 其中方括号[]中的项为可选项。 各项的意义介绍如下。 **1) 类型** 类型字符用以表示输出数据的类型,其格式符和意义如下表所示: | 格式字符 | 意义 | | -------- | -------------------------------------------- | | %d | 以十进制形式输出带符号整数(正数不输出符号) | | %o | 以八进制形式输出无符号整数(不输出前缀`0`) | | %x,%X | 以十六进制形式输出无符号整数(不输出前缀`Ox`) | | %u | 以十进制形式输出无符号整数 | | %f | 以小数形式输出单、双精度实数 | | %e,%E | 以指数形式输出单、双精度实数 | | %g,%G | 以%f或%e中较短的输出宽度输出单、双精度实数 | | %c | 输出单个字符 | | %s | 输出字符串 | **2) 标志** 标志字符为 -、+、# 和空格四种,其意义下表所示: | 标 志 | 意义 | | ----- | ------------------------------------------------------------ | | - | 结果左对齐,右边填空格 | | + | 输出符号(正号或负号) | | 空格 | 输出值为正时冠以空格,为负时冠以负号 | | # | 对c、s、d、u类无影响;<br/> 对o类,在输出时加前缀`o`;<br/> 对x类,在输出时加前缀`0x`;<br/> 对e、g、f 类当结果有小数时才给出小数点。 | **3) 输出最小宽度** 用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。 **4) 精度** 精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。 **5) 长度** 长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。 > 例: ```c #include <stdio.h> int main(){ int a=15; float b=123.1234567; double c=12345678.1234567; char d='p'; printf("a=%d\n", a); printf("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a); // %% 可以输出 % printf("a=%f\n", b); printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b); printf("c=%f\n", c); printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c); printf("d=%c\n", d); printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d); return 0; } ``` > 结果: ``` a=15 a(%d)=15, a(%5d)= 15, a(%o)=17, a(%x)=f a=123.123459 b(%f)=123.123459, b(%lf)=123.123459, b(%5.4lf)=123.1235, b(%e)=1.231235e+002 c=12345678.123457 c(%lf)=12345678.123457, c(%f)=12345678.123457, c(%8.4lf)=12345678.1235 d=p d(%c)=p, d(%8c)= p ``` ## `srpintf()` **srpintf()函数的功能非常强大:效率比一些字符串操作函数要高;而且更具灵活性;可以将想要的结果输出到指定的字符串中,也可作为缓冲区,而printf只能输出到命令行上** 头文件:stdio.h 函数功能:格式化字符串,将格式化的数据写入字符串中。 函数原型:int sprintf(char *buffer, const char *format, [argument]...) 参数: 1. buffer:是char类型的指针,指向写入的字符串指针; 2. format:格式化字符串,即在程序中想要的格式; 3. argument:可选参数,可以为任意类型的数据; 函数返回值:buffer指向的字符串的长度; 例如: ```c #include <stdio.h> int main() { char buffer[10]; char *a = "1234"; char *b = "5678"; sprintf(buffer, "%s%s", a,b); printf("%s\n", buffer); return 0; } ``` > 结果: ```c 12345678 ``` ## `fprintf()` 3,fprintf是用于文件操作。 原型: ``` int fprintf(FILE *stream,char *format,[argument]); ``` 功能:fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件。 > 例子: > ```c char name[20] = "lucy"; FILE *out; out = fopen( "output.txt", "w" ); if( out != NULL ) printf( out, "Hello %s\n", name ); ``` 返回值:若成功则返回输出字符数,若输出出错则返回负值。 最后修改:2022 年 01 月 30 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏