【内部资料】c++详解gets\fgets\getchar\scanf\std::cin等读入方式。
C++中有多种读入方式,包括gets、fgets、getchar、scanf、std::cin等。下面是对它们的详细解释:
gets():
gets()函数用于从标准输入(键盘)读取字符串,并存储到指定的字符数组中。它不进行输入大小检查,容易导致缓冲区溢出问题,因此在实际应用中应尽量避免使用。fgets():
fgets()函数与gets()类似,但它可以指定最大读取字符数,从而避免缓冲区溢出问题。通常用于从标准输入读取一行字符串。getchar():
getchar()函数用于从标准输入读取单个字符。它通常在循环中用于逐个读取字符,直到达到某个终止条件。scanf():
scanf()函数是C语言中用于格式化输入的函数,可以根据指定的格式从标准输入中读取数据。在C++中也可以使用,但不推荐,因为它不是类型安全的,容易导致一些不可预料的问题。std::cin:
std::cin是C++中用于从标准输入读取数据的标准输入流。它是面向对象的输入方式,与C语言中的输入函数相比更加类型安全,通常在C++中被广泛使用。
除了上述方法,还有一些其他的读入方式,比如从文件读取、从字符串流中读取等,具体使用取决于具体情况和需求。在C++中,推荐使用std::cin和getline()函数来进行输入操作,以确保类型安全和避免缓冲区溢出等问题。
以下是使用不同读入方式的简单示例代码:
#include <iostream>
#include <cstdio> // 包含C标准输入输出头文件
using namespace std;
int main() {
// 使用 gets() 读取字符串
char str1[100];
cout << "Enter a string using gets(): ";
gets(str1);
cout << "You entered: " << str1 << endl;
// 使用 fgets() 读取字符串
char str2[100];
cout << "Enter a string using fgets(): ";
fgets(str2, 100, stdin); // 最多读取100个字符,从标准输入(stdin)读取
cout << "You entered: " << str2;
// 使用 getchar() 逐个读取字符
cout << "Enter a string using getchar(): ";
char c;
while ((c = getchar()) != '\n' && c != EOF) {
// 当遇到换行符或文件结束符时退出循环
cout << "You entered: " << c << endl;
}
// 使用 scanf() 读取整数
int num;
cout << "Enter an integer using scanf(): ";
scanf("%d", &num);
cout << "You entered: " << num << endl;
// 使用 std::cin 读取字符串
string str3;
cout << "Enter a string using std::cin: ";
getline(cin, str3);
cout << "You entered: " << str3 << endl;
return 0;
}请注意,对于 gets()、fgets() 和 scanf() 等函数,需要小心输入的大小,以防止缓冲区溢出。而 std::cin 和 getline() 则更为安全,推荐在实际开发中使用。std::getline() 函数可以读取输入流中的一行字符,并将其存储到给定的字符串对象中,而不是直接给字符数组赋值。
fgets 如果不知道具体长度呢
如果不知道要读取的字符串的确切长度,可以动态分配足够大的内存来存储字符串。在这种情况下,可以使用 fgets() 函数读取输入,然后根据需要调整内存大小。
以下是一个示例代码:
#include <iostream>
#include <cstdio>
#include <cstring> // 包含字符串处理函数的头文件
using namespace std;
int main() {
const int bufferSize = 256; // 设定一个初始的缓冲区大小
char *buffer = new char[bufferSize]; // 动态分配内存
cout << "Enter a string: ";
fgets(buffer, bufferSize, stdin); // 从标准输入读取字符串
// 检查是否读取了整行,如果没有,则可能存在剩余的输入在输入缓冲区中
if (strchr(buffer, '\n') == NULL) {
// 清除输入缓冲区中剩余的内容
int c;
while ((c = getchar()) != '\n' && c != EOF) {}
}
// 输出读取的字符串
cout << "You entered: " << buffer << endl;
// 释放动态分配的内存
delete[] buffer;
return 0;
}
在这个示例中,我们首先创建一个足够大的字符数组来存储输入的字符串,然后使用 fgets() 函数从标准输入中读取字符串。如果读取的字符串超过了缓冲区的大小,则可能只读取部分字符串。接着,我们检查是否读取了整行,如果没有,则清除输入缓冲区中剩余的内容。最后,我们输出读取的字符串,并释放动态分配的内存。
在 C11 标准中,gets() 函数被弃用了。弃用意味着该函数被标记为不推荐使用,并且可能在未来的标准中被移除或废弃。原因是 gets() 存在缓冲区溢出的安全漏洞,因为它不对输入字符数进行任何检查。相比之下,fgets() 函数在读取字符串时需要指定最大读取字符数,从而可以更安全地使用。
因此,自从 C11 标准起,C语言的标准头文件 <stdio.h> 中就不再声明 gets() 函数。取而代之的是应该使用更安全的 fgets() 函数来进行字符串输入。

- 上一篇:【内部资料】C++输入输出的效率优化
- 下一篇:c++中while和for能一起用吗
