当前位置:首页 C++内部资料 > 正文

【内部资料】c++详解gets\fgets\getchar\scanf\std::cin等读入方式。

作者:野牛程序员:2024-03-17 09:45:52 C++内部资料阅读 797
【内部资料】c++详解gets\fgets\getchar\scanf\std::cin等读入方式。

C++中有多种读入方式,包括gets、fgets、getchar、scanf、std::cin等。下面是对它们的详细解释:

  1. gets()

    • gets() 函数用于从标准输入(键盘)读取字符串,并存储到指定的字符数组中。它不进行输入大小检查,容易导致缓冲区溢出问题,因此在实际应用中应尽量避免使用。

  2. fgets()

    • fgets() 函数与gets()类似,但它可以指定最大读取字符数,从而避免缓冲区溢出问题。通常用于从标准输入读取一行字符串。

  3. getchar()

    • getchar() 函数用于从标准输入读取单个字符。它通常在循环中用于逐个读取字符,直到达到某个终止条件。

  4. scanf()

    • scanf() 函数是C语言中用于格式化输入的函数,可以根据指定的格式从标准输入中读取数据。在C++中也可以使用,但不推荐,因为它不是类型安全的,容易导致一些不可预料的问题。

  5. std::cin

    • std::cin 是C++中用于从标准输入读取数据的标准输入流。它是面向对象的输入方式,与C语言中的输入函数相比更加类型安全,通常在C++中被广泛使用。

除了上述方法,还有一些其他的读入方式,比如从文件读取、从字符串流中读取等,具体使用取决于具体情况和需求。在C++中,推荐使用std::cingetline()函数来进行输入操作,以确保类型安全和避免缓冲区溢出等问题。

以下是使用不同读入方式的简单示例代码:

#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::cingetline() 则更为安全,推荐在实际开发中使用。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() 函数来进行字符串输入。



野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 最新推荐

    热门点击