【问题标题】:Input Redirection not working?输入重定向不起作用?
【发布时间】:2013-01-30 01:33:15
【问题描述】:

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

我的项目名称是 Input,我的文本文件是 input.txt。当我运行它时,我输入“Input

#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");
}

【问题讨论】:

  • 您使用的是什么操作系统?
  • 我相信你的问题是你不想打开程序然后输入Input &lt; input.txt。您需要从命令行执行该命令。
  • 您是否在命令周围包含引号?如果是这样,请删除它们。如果没有,可能 Win8 已经有一个名为Input 的命令。尝试将您的代码编译为具有不同名称的 exe。
  • 为了将来参考,请复制并粘贴您输入的确切命令及其产生的输出。
  • 请注意,您的代码会跳过第一个字符。您还应该将getchar() 中的值读入int,以便正确识别EOF。

标签: c


【解决方案1】:

我认为问题在于您不想进入程序并输入Input &lt; input.txt。相反,您想打开一个终端程序,将目录更改为包含该项目的目录,然后通过编写Input &lt; 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产生的字符,没有特殊情况。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多