【内部资料】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能一起用吗