fgets()/gets()/scanf() 之后 scanf() 的问题2024年8月28日 | 阅读 4 分钟 scanf() 函数是 C/C++ 中一个常用的函数。尽管其语法基础,但在某些情况下使用它时需要特别注意,这一点至关重要。一个例子就是在 scanf() 之后调用 fgets()。 在本文中,我们将探讨为什么 fgets() 在 scanf() 之后无法正常工作,以及可能的解决方案。首先,让我们看看 scanf() 和 fgets() 函数是如何执行的。 在 C 语言中,scanf() 是一个库函数。它从 stdin 读取标准输入。在 C 语言中,fgets() 也是一个库函数。它从给定的流中读取一行,并将其保存在相关的字符串变量中。它仅在满足以下条件之一时才会结束:
下面是一个示例,展示了我们如何使用 scanf() 函数。 C 代码 输入 输出 Enter name: Box Entered Name: Box 在 C/C++ 中使用 fgets() 函数在 fgets() 函数中,fgets 是“file get string”(文件获取字符串)的缩写。它基本上是一个从流(文件流或标准输入流)中读取最多 n 个字符并将其转换为字符串 str 的函数。其声明如下: char* fgets(char* str, int n, FILE* stream); 让我们详细分析这个声明的每一部分。
在 scanf() 之后使用 fgets() 的问题假设我们现在已经理解了 fgets() 和 scanf() 函数的工作方式,让我们来研究一下当我们在 scanf() 函数之后立即使用 fgets() 函数时会发生什么,以及 fgets() 是否在 scanf() 之后仍然有效。 输入 输出 7 a = 7, str = Box dash: 2: Box: not found 可以看到,字符串 "Box" 没有被打印出来。这是什么原因呢?问题的原因在于 scanf() 函数的一个特定功能。 除了从标准输入流读取数据外,scanf() 函数还会在缓冲区中插入一个换行符。因此,在上面的代码中,scanf() 函数在读取整数 a 后留下了一个换行符。fgets() 函数在读取到这个换行符后就结束了处理(回想一下我们讨论的 fgets() 操作结束读取输入的三个条件)。结果,fgets() 方法忽略了字符串 "Box" 并且没有打印它。 在我们使用 scanf() 时,记住它的这一方面至关重要。但是现在需要解决 fgets() 在 scanf() 之后无法工作的问题。如何才能也打印出字符串 "Box" 呢? 问题的解决方案既然已经探讨了为什么 fgets() 在 scanf() 之后会失败的问题,就可以得出一个解决方案。请注意下面的代码。 C 代码 输入 输出 a = 22, string = Box
1. 如何让 Fgets 在 scanf 之后执行? 在 scanf() 中添加一个 "\n",如 scanf("%d\n", &x),或者在 scanf() 之后使用 getchar() 都可以解决这个问题。 2. 使用 scanf() 需要什么语法? scanf() 函数的语法如下:int scanf(const char *format,...); 3. 为什么 fgets 在 scanf 之后不执行? 在 scanf() 中添加一个 "\n",如 scanf("%d\n", &x),或者在 scanf() 之后使用 getchar() 都可以解决这个问题。fgets() 函数在读取到(由 scanf() 留下的)换行符后结束了操作。 4. C 语言中的 Scanf 返回什么? Scanf 返回成功输入的总数,或者在出错的情况下返回 EOF(End of Line,应为 End of File)。 5. Fgets 是否比 Scanf 更可取? 在做出选择之前,有几件事需要考虑。虽然 scanf() 只能从标准输入读取,但 fgets() 可以从任何文件流中读取。 6. 使用 fgets() 需要什么语法? 使用 fgets() 的语法如下:char* fgets(char* str, int n, FILE* stream); 结论如果在 fgets() 方法之前使用了 scanf() 函数,可能会出现一个非常常见的问题。由于 scanf() 方法在缓冲区中留下了一个换行符,导致 fgets() 函数无法读取部分输入。在 scanf() 中添加一个 "\n",如 scanf("%d\n", &x),或者在 scanf() 之后使用 getchar() 都可以解决这个问题。 下一主题# |
Diffie-Hellman 算法是一种在公共通道上交换加密密钥的有效方法。它是最早的公钥协议之一。Diffie-hellman 密钥交换由 Ralph Merkle 发明,并以 Whitfield Diffie 和 Martin Hellman 的名字命名。DH (Diffie-Hellman) 是第一个实例...
阅读 6 分钟
引言构造函数是 C++ 中用于初始化类对象的独特成员函数。创建对象时会自动调用它们。转换构造函数,通常称为单参数构造函数或转换构造函数,是 C++ 的一项有效功能,它允许在各种...
阅读 3 分钟
复制省略被定义为一种优化技术,用于避免不必要的对象复制。通常,所有编译器都使用复制省略技术。对于绑定到引用的临时对象,此优化技术不可用。它也是...
阅读1分钟
? 树是一种分层数据结构,由以父子关系组织的节点组成。树中的每个节点都有一个或多个子节点,并且除根节点外,每个节点都有一个父节点。根节点是树中的最高节点...
阅读 3 分钟
在 C++ 中,typeid 运算符是一个内置运算符,允许您在运行时检索对象的类型信息。它是一个强大的工具,可用于测试、调试和编写更有效、更灵活的代码。typeid 运算符接受一个参数...
阅读 10 分钟
在本文中,我们将讨论 C++ 中的 fma() 函数,包括其语法、参数和示例。简介:C 函数 fma() 设计用于执行合并乘法运算,该运算将 (x * y) + z 作为单个合并操作进行计算,从而减少可能发生的舍入误差……
阅读 4 分钟
简介:作为概率数据结构的布隆过滤器,提供了一种节省空间的方法来确定一个元素是否属于一个集合。自 1970 年由 Burton Howard Bloom 开发以来,它们已被广泛应用于许多计算机科学和工程领域。布隆过滤器非常有用...
阅读 6 分钟
C++ 中的 std::array::crbegin 函数是 std::array 类模板的成员函数,该类模板是标准模板库 (STL) 的一部分。此函数用于获取指向 std::array 最后一个元素的逆向迭代器。换句话说,它用于...
阅读 6 分钟
C++ 中的 Rint()、Rintf() 和 Rintl() 函数 在本文中,您将了解 C++ 中的 rint()、rintf() 和 rintl() 函数及其语法和示例。C++ 中的“rint()、rintf()、rintl() 函数”简介:在 C++ 中,rint()、rintf() 和 rintl() 功能是头文件的一部分……
阅读 4 分钟
? 在本文中,我们将讨论如何在 C++ 中创建用户定义数据类型的堆栈。但在讨论创建堆栈之前,我们必须了解堆栈。std::stack 是什么意思?堆栈是一种数据结构,使用后进先出 (LIFO) 原则...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India