如何修复 scanf 将数据放入数组中?

2024-04-29

有人可以就 scanf 提出建议吗? “message”是一个 4 行 x 16 列的数组。 用户输入数字(全部为 1 位整数)后,按“Enter”键时会出现错误消息。正如所说 - 可能与 scanf 有关。

for (int i = 0; i < M; i++) {
        for (int j = 0; j < columns; j++) {
            scanf("%d", message[i][j]);
        }
}

scanf seems就像一种好的、简单的、简单的、方便的方式来读取输入。在某些方面确实如此,但事实证明,正确使用它可能非常困难,而且充满了陷阱。

您可能不想了解所有内容scanf一开始的复杂性。所以现在,这里有一些使用指南subset of scanf的功能,安全。 (由于我无法理解的原因,每个人都告诉初学者使用scanf,但没有人同时教授这样的规则。)

  1. 请记住始终使用&在您要读取的变量前面。 (这是一个特殊的规则,对于scanf仅有的。不要尝试使用它&关于您传递给的变量printf, 例如。)
  2. 规则 1 的例外:执行not使用&当你读取字符串时%s.
  3. 如果您正在使用读取字符串%s,确保您读入的变量是一个对于用户可能输入的内容来说足够大的字符数组,或者是一个指向malloc'ed 内存足够大,足以容纳用户可能键入的内容。 (另请参阅下面有关避免溢出的注释。)
  4. 意识到%s读取字符串don't包含空格字符。你不能使用%s读取可能包含空格的字符串(如全名)。 (现在,请不要担心如何读取可能包含空格的字符串。另请参阅规则 14。)
  5. 不要尝试使用scanf and fgets(或过时的gets)一起在同一个程序中。
  6. 不要尝试使用scanf and getchar一起在同一个程序中。
  7. 尝试将自己限制为仅使用格式说明符%d, %s, %f, and %lf, 读入类型变量int, 字符串(参见规则 3),float, and double, 分别。
  8. 如果你想将一个字符读入一个类型的变量中char, 您可以使用" %c",但其中神秘的额外明确的空间特征至关重要。
  9. 仅使用一个%签入格式字符串,以读取一个变量。不要尝试在一个变量中读取两个或多个变量scanf call.
  10. Always check scanf的返回值。如果返回0或者负值EOF,这意味着它没有成功读取任何内容。如果返回1,则表示成功读取一个值。 (如果您违反规则 9,并尝试读取多个值,它将返回成功读取的值的数量,介于 0 和您要求的数量之间的任何位置。)
  11. If scanf返回 0 或EOF,表明用户没有输入有效值,只是打印错误消息并退出。不要尝试编写要求用户重试的代码,因为用户的错误输入仍然保留在输入流中,并且没有好的、简单的方法来消除它。 (如果您确实想编写用户友好的代码,在出现错误时重新提示,scanf不是适合这项工作的工具。)
  12. 切勿在格式字符串后添加空格。这包括换行符\n。 (也就是说,使用"%d", not "%d " or "%d\n".)
  13. 不要尝试使用%[…]说明符。
  14. 如果你违反了规则 13(也许是因为有人告诉你%[…]可能是读取包含空格或整行的字符串的方法),执行not put an s在它之后。格式为%[…], not %[…]s.

这些规则可能看起来有限制性,but如果遵循这些规则,您应该能够简单、轻松、可靠地将简单的输入输入到简单的程序中,这就是这里的目标。scanf否则会非常难以使用,经验表明,往往会出现 17 个不同的令人恐惧的令人沮丧的问题,而尝试解决这些问题完全是不必要的干扰,无法干扰您通过编写简单的 C 程序来学习 C 的目标。

当你读取字符串时%s or %[…],存在危险:无论数组有多大或malloc您正在读入的 ed 缓冲区是,用户可能会输入更多内容。为了避免溢出,您可以使用类似的格式%19s明确地告诉scanf允许读取多少个字符。 (记住减去 1,为终止留出空间'\0'。也就是说,你会使用%19s读入char str[20]; or char *p = malloc(20);.)

这些规则有点多。有关更简单的规则集,请参阅这个答案 https://stackoverflow.com/questions/69213541/having-difficulty-correctly-inputting-multiple-integers-at-the-same-time-using-s/69223945#69223945。将规则 7、8、9、12 和 13 放在一起,实际上只有五个完整的格式字符串可供您使用scanf: "%d", "%s", "%f", "%lf", or " %c"。 (但是没有逗号,没有固定字符串,除了显式空格之外没有空格" %c",没有别的。)例外:如上所述,可以使用类似的东西%19s限制正在读取的字符串的长度。

如果您需要做一些在遵守这些规则的情况下无法完成的更复杂的事情,那么是时候执行以下任一操作:

  1. 足够了解how scanf真的有效 https://stackoverflow.com/questions/68952584/how-does-scanf-know-if-it-should-scan-a-new-value/68952778#68952778(并且不起作用)这样你就可以尝试做你想做的事情,但不会陷入这 17 个问题之一,或者
  2. 了解如何使用比方法更好、更强大的方法scanf https://stackoverflow.com/questions/58403537,也许通过使用读取整行fgets然后解析它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复 scanf 将数据放入数组中? 的相关文章

  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐