C - scanf() 与 gets() 与 fgets()

2024-02-11

我一直在做一个相当简单的程序,将字符串(假设输入数字)转换为整数。

完成后,我注意到一些非常奇特的“错误”,我无法回答,主要是因为我对如何进行的了解有限。scanf(), gets() and fgets()功能发挥作用。 (不过我确实读了很多文献。)

因此,无需编写太多文字,以下是程序代码:

#include <stdio.h>

#define MAX 100

int CharToInt(const char *);

int main()
{
    char str[MAX];

    printf(" Enter some numbers (no spaces): ");
    gets(str);
//  fgets(str, sizeof(str), stdin);
//  scanf("%s", str);

    printf(" Entered number is: %d\n", CharToInt(str));

    return 0;
}

int CharToInt(const char *s)
{
    int i, result, temp;

    result = 0;
    i = 0;

    while(*(s+i) != '\0')
    {
        temp = *(s+i) & 15;
        result = (temp + result) * 10;
        i++;
    }

    return result / 10;
}

这就是我一直遇到的问题。一、使用时gets()功能,程序完美运行。

二、使用时fgets(),结果有点错误,因为显然fgets()函数最后读取换行符(ASCII 值 10),这会搞乱结果。

三、使用时scanf()函数,结果是完全错误的,因为第一个字符显然具有 -52 ASCII 值。对于这一点,我没有任何解释。

现在我知道了gets()不鼓励使用,所以我想知道是否可以使用fgets()在这里,所以它不会读取(或忽略)换行符。 另外,这有什么关系scanf()这个程序中的函数?


  • Never use gets。它没有提供针对缓冲区溢出漏洞的保护(也就是说,您无法告诉它传递给它的缓冲区有多大,因此它无法阻止用户输入大于缓冲区的行并破坏内存)。

  • 避免使用scanf。如果使用不小心,它可能会出现与以下相同的缓冲区溢出问题:gets。即使忽略这一点,它还有其他问题使其难以正确使用 http://c-faq.com/stdio/scanfprobs.html.

  • 一般来说你应该使用fgets相反,尽管有时很不方便(你必须去掉换行符,你必须提前确定缓冲区大小,然后你必须弄清楚如何处理太长的行 - 你是否保留你阅读的部分以及丢弃多余的 http://home.datacomm.ch/t_wolf/tw/c/getting_input.html,放弃整个事情,动态增长缓冲区并重试,等等)。有一些非标准函数可以为您执行此动态分配(例如getline在 POSIX 系统上,查克·法尔科纳的公共领域ggets http://web.archive.org/web/20080525133110/http://cbfalconer.home.att.net/download/功能)。注意ggets has gets- 类似语义,因为它会为您删除尾随换行符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C - scanf() 与 gets() 与 fgets() 的相关文章

  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • 当 f & g 修改同一个全局变量时,表达式 f() > g() 的值是否未定义或未指定?

    UPDATE 由用户标记ecatmur 它是重复的在 C99 中 f g 是未定义还是只是未指定 https stackoverflow com questions 3951017 in c99 is fg undefined or mer
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 通过用于 Symbol 条码扫描仪 DS4208 的 SNAPI.dll API 捕获图像

    我想通过 SNAPI API 从 Symbol 目前为 Zebra 条形码扫描仪 DS4208 型号 我们还使用 Zebra 的另一个但兼容的型号 捕获图像 条形码捕获 识别效果很好 但看起来像SnapiDLL SNAPI SnapShot
  • 我的 WPF 应用程序未触发 MainWindow_Loaded

    我目前正在关注Pluralsight C Fundamentals Part 1并在Classes and Objects视频部分指导我在 Visual Studio 中创建一个新的 WPF 应用程序并填写代码 这导致以下结果 namesp
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • C 中的链表数组:初始化和插入?

    我需要创建一个链表数组 如图所示 这就是我到目前为止所做的 typedef struct Node int data struct Node next Node int main void Node link 5 for int q 0 q
  • C++:LPWSTR 在 cout 中打印为地址

    我有一个类型变量LPTSTR 我打印到std cout with lt lt 在 ANSI 系统中 不知道它是在哪里确定的 它工作得很好 它打印了字符串 现在 在 Unicode 系统中 我得到的是十六进制地址而不是字符串 那么 为什么LP
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • Safari 中的 Vue.js 渲染问题

    我有一个使用 Vue 和 Laravel 编写的作品集网站 它使用 v for 呈现项目缩略图 除了 Safari 之外 这在每个浏览器上都工作得很好 但有一个奇怪的问题 除非用户调整浏览器窗口的大小 否则图像根本不会显示 相关代码如下 d
  • 如何在使用 Python 运行 wkhtmltopdf.exe 时停止弹出窗口

    我正在使用 wkhtmltopdf exe 使用 python 将 html 转换为 pdf wkhtmltopdf exe 的弹出窗口使我在运行它时很难处理任何其他事情 我必须转换大约 200K 个文件 并且必须同时处理其他事情 但它确实
  • 是否可以将摘要式身份验证与 XMLHTTPRequest 一起使用?

    我有一个简单的问题 是否可以将摘要式身份验证与 XMLHTTPRequest 一起使用 如果答案是否定的 那么技术原因是什么 或者如果可能的话 我该怎么做 非常感谢 谷歌到目前为止还没有好的答案 EDIT 感谢您的回答 在收到随机数后修改标
  • 设置 WPF ScrollViewer 中何时滚动

    我有一个滚动查看器 其中包含一个网格 其中有一堆表单控件 文本框 复选框 组合框等 当我通过选项卡浏览控件时 滚动查看器将滚动 但仅在必要时滚动 我的意思是我通过选项卡浏览滚动查看器中的所有内容 并且仅当控件不可见时滚动查看器才会滚动 我想
  • 为什么这些线程不按顺序运行?

    当我运行这段代码时 include
  • 在 Laravel 中同步一对多关系

    如果我有一个多对多的关系 那么用它的关系更新关系是非常容易的sync method 但是我用什么来同步一对多关系呢 table posts id name table links id name post id 在这里 每一个Post可以有
  • Google OAuth:如何使用刷新令牌?

    我可以将 Android 设备上的一次性使用令牌换成访问令牌 and a 刷新令牌 我正在尝试弄清楚如何使用刷新令牌 I found this https developers google com accounts docs OAuth2
  • 在 R 中导入和分析非矩形 .csv 文件

    我将从 Mathematica 迁移到 R 在导入过程中我不需要预测数据结构 特别是我不需要在导入之前预测数据的矩形性 我有很多文件 csv文件格式如下 tasty chicken cinnamon not tasty butter pep
  • 如何在 android 中显示简单的通知? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在 Android 的通知栏中显
  • 寻找一种优雅且非侵入性的方式来访问类的私有方法

    免责声明 这绝不意味着在生产代码中使用 这是对 C 边缘的探索 我的问题是一个后续问题 基于与 Johannes Schaub 的讨论 在c 中调用私有方法 https stackoverflow com questions 6873138
  • 强制 enum 为 unsigned long 类型

    是否可以强制枚举的基础类型为 unsigned long 类型 谢谢 在 C 11 及更高版本中 您可以明确提及您想要的类型 enum MyEnumeration unsigned long values go here 这将允许您显式控制
  • 如何从 AWS Codebuild 构建规范文件中排除文件夹?

    所以我需要从我的工件中排除一个文件夹 但谷歌搜索找不到任何信息 version 0 2 phases install runtime versions nodejs 10 build commands echo Build started
  • 计算计算着色器内帧缓冲区的颜色直方图

    正如标题所示 我正在将场景渲染到帧缓冲区上 并尝试从计算着色器内的帧缓冲区中提取颜色直方图 我对使用计算着色器完全陌生 并且缺乏教程 示例 关键字让我不知所措 特别是 我正在努力正确设置计算着色器的输入和输出图像 这是我所拥有的 compu
  • 如何加快Python中的字符串连接速度?

    在下面的代码中 串联是瓶颈 正如你所看到的 我尝试了一些复杂的方法来加快速度 但无论如何它都很慢 我想知道是否有什么我可以做的来使它更快 顺便说一句 普通和秘密都是从二进制文件读取的数据 它们都很大 大约 1mb x b if len pl
  • 在 Cocoa 程序中访问 Swift REPL

    我可以将 LLDB 附加到用 Swift 编写的程序并访问 REPL 无论是从 Xcode 内还是通过运行 lldb n ProcessName lldb repl 1 gt 但是 如果我将 LLDB 附加到没有 Swift 运行时的进程
  • Activity 生命周期 - 每次重新定向时都会调用 onCreate

    我有一个简单的活动 可以加载位图onCreate 我发现如果我旋转设备 我可以从日志中看到onCreate又打电话来了 事实上 因为所有实例变量都再次设置为默认值 所以我知道整个 Activity 已被重新实例化 旋转 2 次后 我得到 F
  • Django 国家/地区按翻译名称排序

    我开始使用 django countries 并向我的模型之一添加一个字段 country CountryField blank True 问题是用户的语言是西班牙语 当表格显示国家列表时 它们被正确翻译 但他们是按我猜的代码或英文名称排序
  • 如何使用 Django 进行 RDS IAM 身份验证?

    我希望我的 django 应用程序使用 IAM 身份验证连接到 RDS postgres 这意味着数据库密码每 15 分钟就会过期 应该重新生成 问题是如何在运行时更改数据库密码 或者我应该更新我的数据库 URL 环境 我们为此功能实现了一
  • 为什么Sortable概念需要完全有序的值类型,而std::sort只需要“小于”可比较?

    In the 关于概念 N3701 的最新论文 http www open std org jtc1 sc22 wg21 docs papers 2013 n3701 pdf 有以下示例sort算法 template
  • C - scanf() 与 gets() 与 fgets()

    我一直在做一个相当简单的程序 将字符串 假设输入数字 转换为整数 完成后 我注意到一些非常奇特的 错误 我无法回答 主要是因为我对如何进行的了解有限 scanf gets and fgets 功能发挥作用 不过我确实读了很多文献 因此 无需