首页 > 解决方案 > 交互式、限制性、动态的用户输入

问题描述

标签: cmultidimensional-arrayfgets

解决方案


好的,我可以看看你的程序。问题不在于分配,而在于字符串管理。在 C 中,字符串是一个以空字符结尾的字符数组(请复制 100 次...)。

当你用 读取一行时fgets,你会在缓冲区中获得换行符 ( \n),所以如果用户键入Y Enter你会得到{'Y', '\n', '\0', undeterminated_char }. 那么以下realloc是完全错误的:

  • 这很可能是一个问题:编译器只会给你一个至少与你的要求一样大的缓冲区。由于 4 > 1,它可以(和我的实现一样)使原始缓冲区保持不变
  • 您不得使用超出您要求的任何内容,特别是,您不应假设有一个空值!

所以如果你坚持做一个字符串比较,你应该只确保第二个字符为空:user_input[i][2] = '\0';

但恕我直言,这里需要的只是:

if (user_input[i][0] == 'Y') {
    ...

这还不是全部。您尝试在输入处理方面做得很好,但只是忘记了一个细节:如果一行比声明的大小长,则fgets填充其缓冲区并保留该行的剩余部分以供下次读取。

以下只是我的建议:

你试图将你所知道的一切(可能还有你没有完全掌握的东西......)运用到一个单一而简单的程序中。不。让每个程序尽可能简单(保持愚蠢简单是一种普遍的好习惯......),并相信你的学习者会给你其他模式的其他任务。所以在这里你应该:

  • 阅读一行,直到找到\n(可能需要几个fgets
  • 测试缓冲区的第一个字符是'Y''N'
  • 测试第二个'\0'

由于这是现实世界中的常见要求,并且只有在您的程序运行之后,您才能考虑:

  • 忽略初始空白字符
  • 接受小写为大写
  • 接受第一个字符之后的任何字符(以接受是和否)

如果好的编码对您很重要,最后的建议是:一旦您的程序正常运行,您应该考虑将其发布到Code Review中以获得有趣的评论。


推荐阅读