c - 交互式、限制性、动态的用户输入
问题描述
解决方案
好的,我可以看看你的程序。问题不在于分配,而在于字符串管理。在 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中以获得有趣的评论。
推荐阅读
- python - django快速访问界面引起的问题
- python - 在python中使用for循环将多个列表合并为一个列表
- php - Laravel HTML 无法正确显示
- azure-devops - 在 Azure DevOps 中构建 NuGet 后更新 packages.config
- python - 如何解决 Python 中的 Google Sheet API 错误
- laravel - laravel dompdf 未定义类型 'PDF'
- mysql - django 设置文件中的数据库选项不起作用
- ceph - cephadm:无法将节点添加到 ceph 集群(错误 EINVAL:无法连接到主机)
- javascript - 如何让浏览器检测输入字段值的变化?
- ios - 自定义 tabview 标题栏