输入输出
C++语言标准函数库提供了许多标准输入、输出函数,本节将介绍 6 个最基本的输入、输出函数:字符输入
getchar
,字符输出putchar
,格式化输入scanf
,格式化输出printf
,流输入cin
,流输出cout
。
# 字符输入函数 getchar
getchar
函数是用于接收从键盘输入的单个字符数据。它是一个无参函数,其语法格式为:getchar()
。
说明:
- 通常将输入的字符赋予一个字符变量,构成赋值语句。
getchar
函数只能接受单个字符,输入数字也按字符处理。- 当输入多于一个字符时,
getchar
函数只接收第一个字符。 getchar
函数等待用户输入,直到按下回车键才结束,可用于暂停程序的运行,直到输入回车键。- 如果在程序中连续使用两个以上的
getchar
函数,应该一次性输入所需字符,最后再按回车键,否则会把回车作为一个字符传给后面的getchar()
函数。
在 C++中,getchar
和putchar
是 C 标准库提供的函数,而不是 C++标准库提供的。虽然在一些 C++编译器中可以直接使用这些函数,但为了确保最大的兼容性,建议在使用它们时引入对应的头文件。
如果你在使用 getchar
和 putchar
时不引入头文件,但程序没有出现错误,那可能是因为你的编译器对这种情况进行了一些隐式处理。但这并不是一种可靠的做法,因为在其他编译器或环境中,可能会导致编译错误。
为了编写更具可移植性的代码,最好还是在使用 getchar
和 putchar
时显式引入头文件,即 #include <cstdio>
,以确保代码在各种环境中都能正常工作。
示例:
#include <cstdio>
int main() {
char ch;
printf("Please enter a character: ");
ch = getchar(); // 从键盘读取一个字符
printf("You entered: %c\n", ch);
return 0;
}
上述示例演示了如何使用 getchar
函数从键盘读取一个字符,并将其存储在字符变量 ch
中,然后将该字符输出到屏幕上。用户需要按下回车键以结束输入。
# 字符输出函数 putchar
putchar
函数用于将一个字符输出到标准输出设备(通常是屏幕)。它接受一个字符作为参数,将其输出到屏幕上。其语法格式为:putchar(character)
。
说明:
putchar
函数接受一个字符参数或以整数形式表示字符的 ASCII 码值。- 通常用单引号括起来的字符常量作为参数传递给
putchar
。
示例:
#include <cstdio>
int main() {
char ch = 'A';
printf("Outputting character 'A': ");
putchar(ch); // 输出字符 'A' 到屏幕
printf("\n");
return 0;
}
上述示例演示了如何使用 putchar
函数将字符 'A' 输出到屏幕上。
# 格式化输入函数 scanf
scanf
函数用于从标准输入设备中读取数据,并根据格式化字符串的指令将数据赋值给指定的变量。它允许你以特定的格式输入数据。其语法格式为:scanf(const char* format, ...)
。
说明:
scanf
函数的第一个参数是一个格式字符串 format,它包含了格式控制符和空白字符,用于指定要读取的数据的类型和格式。格式字符串可以包含以下类型的格式控制符:常见格式符:
%d
或%i
: 用于输入十进制整数。%u
: 以无符号十进制形式输入十进制整数。%o
: 用于输入八进制整数。%x
或%X
: 用于输入十六进制整数。%c
: 用于输入单个字符。%s
: 用于输入字符串,以空格为分隔符。%f
: 用于输入实数(浮点数),可以包括小数点。%e
: 与%f
相同,用于输入指数形式的实数。
附加格式说明符:
1(字母)
: 用于长整型数和双精度实数。%hd
,%ho
,%hx
: 用于短整型数,八进制和十六进制形式。- 域宽(一个整数):指定输入所占列宽。您可以在格式符前使用数字表示最大字段宽度。
*
: 表示对应输入量不赋给一个变量。这在某些情况下很有用,允许跳过不需要的输入项。
scanf
函数的第二个及以后的参数是要存储读取数据的变量地址,这些参数必须与格式字符串中的格式控制符相匹配。数据将按照格式字符串中的指定格式进行解析,并存储到相应的变量地址中。&
用于创建指向变量的指针,允许scanf
将数据正确存储在该变量的内存位置。
示例:
#include <cstdio>
int main() {
int integerValue;
float floatValue;
// 从标准输入中读取一个整数和一个浮点数
printf("Enter an integer and a floating-point number: ");
// 这里 &integerValue 表示变量 integerValue 的地址,scanf 将从标准输入中读取一个整数
// 并将其存储到 integerValue 的地址指向的内存位置。
scanf("%d %f", &integerValue, &floatValue);
printf("You entered: Integer = %d, Float = %f\n", integerValue, floatValue);
return 0;
}
上面是一个简单的示例,演示如何使用 scanf 函数从标准输入中读取整数和浮点数:
需要注意的是,scanf 函数在读取输入时会忽略空白字符(空格、制表符、换行符等),并根据格式字符串的格式控制符提取相应的数据。如果输入与格式字符串不匹配,scanf 可能会出现问题。因此,必须确保输入数据的格式与格式字符串中的格式一致,以避免潜在的错误。
# 格式化输出函数 printf
printf
函数用于将格式化的数据输出到标准输出设备。你可以使用格式化字符串来指定输出的样式,以及要输出的数据。其语法格式为:printf(const char* format, ...)
。
printf
函数的第一个参数是格式字符串format
,它包含了格式控制符和文本,用于指定要输出的文本以及如何格式化输出的数据。格式字符串可以包含以下内容:普通文本:除格式控制符外的任何文本都会原样输出。
格式控制符:以百分号
%
开头,后跟一个字符,用于指定要输出的数据的类型和格式。
常见的格式控制符
printf
函数的格式符用于指定输出的数据类型和格式。下面是一些常见的printf
格式符及其说明:整数格式符:
%d
或%i
: 以带符号的十进制形式输出整数。%u
: 以无符号十进制形式输出整数。%x
或%X
: 以十六进制无符号形式输出整数(%X
输出大写字母 A-F)。%o
: 以八进制无符号形式输出整数。%c
: 输出一个字符。%s
: 输出字符串。
浮点数格式符:
%f
: 以小数形式输出单精度或双精度浮点数(默认保留 6 位小数)。%e
或%E
: 以指数形式输出单精度或双精度浮点数(默认保留 6 位小数)。%g
或%G
: 自动选择%f
、%e
或%E
格式中输出宽度较小的一种,并省略无意义的小数位。
宽度和精度修饰符:
%mld
: 指定整数输出的宽度位,左边补空格,m
为宽度。%-mld
: 同上,但左对齐输出。%0md
或%0mld
: 宽度不足时左边补零。%*d
或%*f
: 宽度由参数指定,例如printf("%*d", width, value);
。
长整数和长宽度修饰符:
%ld
: 用于输出长整数(长整型)。%lld
: 用于输出长长整数(长长整型)。%hd
: 用于输出短整数(短整型)。对于
printf
函数中的%f
和%s
格式符,以下是详细的说明:%f
格式符:%f
: 以小数形式输出浮点数。%m.nf
: 总宽度为m
(包括小数点和整数部分),其中小数部分的位数为n
。%-m.nf
: 同上,左对齐输出,不足宽度时右边补空格。
%s
格式符:%s
: 按实际宽度输出一个字符串。%ms
: 指定宽度为m
,当字符串宽度不足m
时,左侧补空格,宽度大于m
时,按实际宽度输出。%-ms
: 同上,左对齐输出,不足宽度时右侧补空格。%m.ns
: 输出占m
个字符位置,但最多输出n
个字符,左侧补空格。%-m.ns
: 同上,左对齐输出,不足宽度时右侧补空格。
...
表示可以接受多个参数,根据格式化字符串中的指令,将要输出的数据插入到相应位置。
示例:
#include <cstdio>
int main() {
int age = 30;
printf("My age is %d years old.\n", age); // 输出带格式的文本
return 0;
}
上述示例演示了如何使用 printf
函数输出带有格式的文本。格式化字符串 "My age is %d years old.\n"
中的 %d
指令表示将整数变量 age
的值插入到字符串中,然后输出到屏幕上。
# 流输入函数 cin
cin
是 C++中的标准输入流对象,用于从键盘或其他输入源中获取数据。你可以使用 >>
运算符将数据读取到不同类型的变量中。
说明:
cin
是 C++标准库提供的输入流对象,用于从标准输入设备(通常是键盘)获取数据。- 你可以使用
>>
运算符将数据按指定格式读取到不同类型的变量中。 cin
可以用于读取各种数据类型,如整数、浮点数、字符等。
示例:
#include <iostream>
using namespace std;
int main() {
int num;
cout << "Please enter an integer: ";
cin >> num; // 从键盘读取一个整数
cout << "You entered: " << num << endl;
return 0;
}
上述示例演示了如何使用 cin
输入流对象从键盘读取一个整数,并将其存储在整数变量 num
中,然后将该整数输出到屏幕上。用户需要按下回车键以结束输入。
# 流输出函数 cout
cout
是 C++中的标准输出流对象,用于将数据输出到屏幕或其他输出目标。你可以使用 <<
运算符将数据输出到 cout
。
说明:
cout
是 C++标准库提供的输出流对象,用于将数据输出到标准输出设备(通常是屏幕)。- 你可以使用
<<
运算符将数据按指定格式输出到cout
。 cout
可以用于输出各种数据类型,如整数、浮点数、字符等。
示例:
#include <iostream>
using namespace std;
int main() {
int age = 30;
cout << "My age is " << age << " years old." << endl;
return 0;
}
上述示例演示了如何使用 cout
输出流对象将带有格式的文本输出到屏幕上。通过使用 <<
运算符,你可以将整数变量 age
的值插入到文本中,然后输出到屏幕上。
# 几种输入输出格式的几点说明
cin
和cout
在 Dev C++中只能调用<iostream>
库,而其他输入输出格式需要调用<cstdio>
库或<stdio.h>
库。cin
和cout
属于 C++的概念,它们涉及输入输出流,而scanf
和printf
属于 C 的概念,是 C 语言的标准输入/输出库中的函数。在性能方面,scanf
和printf
比cin
和cout
更高效。特别是对于大规模数据的输入输出,通常情况下更适合使用scanf
和printf
。对于普通数据的输入输出,
cin
和cout
更加方便,而在格式化方面,scanf
和printf
更容易使用。不过需要注意,cin
的效率比scanf
低很多,特别在输入数据量超过 20 万条时,性能差距变得非常明显,甚至在 100 万条数据时,使用cin
可能会导致超时。scanf
和printf
需要指定数据类型,而cin
和cout
能够自动识别变量的数据类型,因此在进行输入输出时,不需要额外指定数据类型。这使得cin
和cout
更易用,但scanf
和printf
在输入输出时需要更多的格式控制。
总结:cin
和 cout
适用于方便的、自动类型识别的输入输出,但可能在性能上不如 scanf
和 printf
,特别在大规模数据处理时。scanf
和 printf
需要更多的格式控制,但在性能上更高效,特别对于大数据处理是更佳的选择。
# 重点小结
cin 和 cout 是 C++ 标准库提供的输入输出流对象。
- cin 用于从标准输入设备(通常是键盘)获取数据。
- cout 用于将数据输出到标准输出设备(通常是屏幕)。
- 你可以使用 >> 运算符将数据从 cin 读取到变量中,以及使用 << 运算符将数据从变量输出到 cout。
getchar 和 putchar 是 C 标准库提供的字符输入和字符输出函数。
- getchar 用于接收从键盘输入的单个字符数据。
- putchar 用于将一个字符输出到标准输出设备。
scanf 和 printf 是 C 标准库提供的格式化输入和格式化输出函数。
- scanf 用于从标准输入设备中读取数据,并根据格式化字符串的指令将数据赋值给指定的变量。
- printf 用于将格式化的数据输出到标准输出设备。它允许你使用格式化字符串指定输出的样式和数据。
选择使用 cin/cout 还是 scanf/printf 取决于需求和性能考虑。
- cin/cout 适用于方便的、自动类型识别的输入输出。
- scanf/printf 更高效,适用于需要更多格式控制的情况和大规模数据处理。