我的指示:编写一个重复(直到文件结尾)读入一个字符的程序 来自输入流。如果字符为大写,请将其更改为小写 并将其写入输出流。对于所有其他角色,请写下 字符不变为输出流。 使用getchar()进行输入,使用putchar()进行输出,并使用输入重定向 用于将输入文件连接到程序
我的项目名称是输入,我的文本文件是input.txt。当我运行它时,我输入“输入< input.txt”程序只是在命令窗口模仿它,所以如何让它从文本文件中读取?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char c, x;
c=getchar();
while (c != EOF)
{
c=getchar();
x = tolower(c);
if (isupper(c))
{
putchar(x);
}
else
{
putchar(c);
}
}
system("Pause");
}
答案 0 :(得分:0)
我认为问题在于您不想转到该程序并输入Input < input.txt
。相反,您要打开终端程序,将目录更改为包含项目的目录,然后通过编写Input < input.txt
从命令行运行该程序。这将启动程序并使用input.txt
的内容作为标准输入流,而不是从控制台读取文本。
那就是说,代码中有两个错误。首先,请注意您有一行
c = getchar();
在循环之外执行输入读取。然后立即致电
c = getchar();
再次进入循环内部。这意味着您要丢弃您所读的第一个字符。
其次,你的循环运行的时间超过了它需要的时间。如果对getchar()
的第二次调用返回EOF
,则在当前循环迭代完成之后才会检测到此情况。这是因为您对EOF
的检查位于循环的顶部,直到您打印出EOF
字符后才能检查到。要解决这个问题,请考虑使用循环半成语并在中间突破循环:
for (;;) {
/* Read data. */
if (/* no data left */) break;
/* Process data. */
}
从风格上讲,您确定在这里需要if
和else
分支吗?回想一下,tolower
不会更改非大写字符的值,因此有一个大写字母和一个小写字母的情况是多余的。您可以在没有特殊情况的情况下输出tolower
生成的字符。
希望这有帮助!
答案 1 :(得分:0)
仅为ASCII文本执行的惯用方法是:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
int c;
while((c = getchar()) != EOF)
putchar(tolower(c));
exit(EXIT_SUCCESS);
}
正如教科书如此喜欢说的那样, UTF-8留给读者轻松练习; - )