c - 如何正确使用EOF?
问题描述
我对 EOF 有疑问。
首先,我正在编写一个简单的程序来处理/打印用户的输入。
但是,程序也会在输出中复制 EOF。
例如,我的操作系统是 Window,当我按顺序键入 (Enter -> cntrl + z -> Enter) 时,我的 EOF 工作。如果我输入“Hello” + Enter + EOF 组合键,输出会在复制的用户输入的末尾打印出奇怪的字母('?')。
我怎样才能摆脱'?在输出的末尾,为什么会这样?
#include <stdio.h>
void copy(char to[], char from[]);
main()
{
int i;
int c;
char origin[10];
char copied[10];
for(i = 0; (c = getchar()) != EOF; ++i)
{
origin[i] = c;
}
copy(copied, origin);
for(i = 0; i < 10; i++)
putchar(copied[i]);
}
void copy(char to[], char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
i++;
}
解决方案
你忘了 NUL-terminate origin
。因此,您在复制期间调用未定义行为。请改用以下代码获取输入:
for(i = 0; i < 9 && (c = getchar()) != EOF; ++i) /* `i < 9` to prevent array overruns */
{
origin[i] = c;
}
origin[i] = '\0'; /* NUL-terminate your string */
还将打印代码更改为:
for(i = 0; copied[i] != '\0'; i++) /* Print until a NUL-terminator */
putchar(copied[i]);
推荐阅读
- c# - 唤醒 Azure 功能
- c# - 如何检查进程是否由 Visual Studio > 2015 启动
- javascript - Django:数据未提交到数据库,但没有错误
- java - 除非重新创建,否则颜色对象不能用作颜色
- java - 我可以在正则表达式中组合 unicode 类别吗?
- flutter - 在flutter中使用video_player插件时如何显示视频的当前播放时间?
- c# - ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute“找不到这个 localhost 页面”
- android - RecyclerView 适配器中的 OnClickListener 未初始化
- javascript - 在 Gatsby 博客中的 url 路径中附加 %20
- arrays - 功能组件中数组的映射以及对特定对象的访问