如何修复 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 将数据放入数组中? 的相关文章

随机推荐