C 语言 标准输入输出
在 C 语言中,输入 意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。 C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。
而 输出 意味着要在屏幕上、打印机上或任意文件中显示一些数据。 C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。
标准输入输出
C 语言把所有的设备都当作文件。 所以设备(比如显示器)被处理的方式与文件相同。
C 语言把标准输入、标准输出、标准错误输出也当做文件。
下面三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 您的屏幕 |
C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数。
- scanf() 函数用于从标准输入(键盘)读取并格式化
- printf() 函数发送格式化输出到标准输出(屏幕)
范例 1 : printf() 函数的使用
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> int main() { printf("Hello World!\nHello www.twle.cn!\n"); return 0; }
编译和运行上面的程序,输出结果如下
$ gcc main.c && a.out Hello World! Hello www.twle.cn!
范例解析
-
printf() 用于格式化输出到屏幕。 printf() 函数在 "stdio.h" 头文件中声明。
-
stdio.h 是一个头文件 (标准输入输出头文件) and #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
-
return 0; 语句用于表示退出程序。
范例 2 :使用 %d 格式化输出整数
在 printf() 函数的引号中使用 "%d" (整型) 来匹配整型变量
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> int main() { int age = 151926; printf("Number = %d\n", age); return 0; }
编译和运行上面的代码,输出结果如下:
$ gcc main.c && a.out Number = 151926
范例 3 : 使用 %f 格式化输出浮点型数据
在 printf() 函数的引号中 使用 %f
来匹配浮点型数据
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> int main() { float f; printf("Please enter a number: "); scanf("%f",&f); printf("You have input = %f\n", f); return 0; }
编译和运行上面的代码,输出结果如下
$ gcc main.c && a.out Please enter a number: 3.14159257575343 You have input = 3.141593
getchar() 和 putchar() 函数
- int getchar(void)
- 从屏幕读取下一个可用的字符,并把它返回为一个整数。 这个函数在同一个时间内只会读取一个单一的字符。
- int putchar(int c)
- 把字符输出到屏幕上,并返回相同的字符。 这个函数在同一个时间内只会输出一个单一的字符。
这两个方法我们都可以在循环内使用,以便从屏幕上读取/输出多个字符
范例
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> int main( ) { int c; printf( "Please enter some text :"); c = getchar( ); printf( "\nYou entered: "); putchar( c ); printf( "\n"); return 0; }
当我们编译和运行上面的代码,它会等待输入一些文本,当我们输入文本并按下回车键时,程序会继续,但只会读取一个单一的字符
$ gcc main.c -std=c11 && a.out Please enter some text :Hello www.twle.cn You entered: H
gets() 和 puts() 函数
- char gets(char s)不推荐
- 从标准输入 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF
- int puts(const char *s)
- 把字符串 s 和一个尾随的换行符写入到标准输出 stdout
范例: gets 和 puts 的演示
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> int main( ) { char str[100]; printf( "Enter a value :"); gets( str ); printf( "\nYou entered: "); puts( str ); return 0; }
当编译和运行上面的代码,它会等待输入一些文本,当我们输入一个文本并按下回车键时,程序会继续并读取一整行直到该行结束。
$ gcc main.c && a.out warning: this program uses gets(), which is unsafe. Enter a value :www.twle.cn You entered: www.twle.cn
scanf() 和 printf() 函数
- int scanf(const char *format, ...)
- 从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入
- int printf(const char *format, ...)
- 把输出写入到标准输出流 stdout ,并根据提供的格式产生输出
format 是一个简单的常量字符串,我们可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。
还有许多其他可用的格式选项,可以根据需要使用。
现在我们通过一个范例来加深理解
#include <stdio.h> int main( ) { char str[100]; int i; printf( "Enter a value :"); scanf("%s %d", str, &i); printf( "\nYou entered: %s %d ", str, i); printf("\n"); return 0; }
但我们编译和运行上面的代码,它会等待我们输入一些文本,我们可以输入一个文本并按下回车键看看效果
$ gcc main.c && a.out Enter a value like "yufei 28" :www.twle.cn 1 You entered: www.twle.cn 1
注意:
-
scanf() 期待输入的格式与我们给出的 %s 和 %d 相同,这意味着必须提供有效的输入,比如 "string integer",如果您提供的是 "string string" 或 "integer integer",它会被认为是错误的输入。
-
在读取字符串时,只要遇到一个空格,scanf() 就会停止读取,所以 "this is test" 对 scanf() 来说是三个字符串