2

我的指示:编写一个重复(直到文件结束)从输入流中读取字符的程序。如果字符为大写,则将其更改为小写并将其写入输出流。对于所有其他字符,将字符原封不动地写入输出流。使用 getchar() 进行输入,使用 putchar() 进行输出,使用输入重定向将输入文件连接到程序

我的项目名称是 Input,我的文本文件是 input.txt。当我运行它时,我输入“Input < 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");
}
4

2 回答 2

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 留给读者作为一个简单的练习;-)

于 2013-01-30T03:04:27.227 回答
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. */
}

从风格上讲,您确定这里需要ifelse分支吗?回想一下,tolower不会更改非大写字符的值,因此为大写字母设置一种情况,为小写字母设置一种情况是多余的。您可以在tolower没有特殊情况的情况下输出生成的字符。

希望这可以帮助!

于 2013-01-30T01:40:08.427 回答