2014-10-01 182 views
0

我编译我的代码,然后运行:$ ./a.exe < input.txt 由于某些原因,它不会读取第一个字符(t从第一行中的测试中缺失) 并且还有一个奇怪的字符在最后。我如何对付这两个错误? 感谢重定向标准输入

#include <stdio.h> 
#include <stdlib.h> 

int main(void) {  
    char c = getchar();  
    while (c != EOF){ 
     printf("%c ",c); 
     c = getchar(); 
    } 
    return (0); 
}   

样品执行:

$ ./a.exe < input.txt 
    e s t l i n e o n e 
t e s t l i n e t w o 
f i n a l l i n e ▒ 
+0

2all回答人:请停止在您的代码段中使用“char c”。所有与char相关的函数都会返回整数,而不是字符,EOF也是如此。 int c - 正确,char c - 错误。 – user3125367 2014-10-01 02:52:30

回答

3

首先,请注意,当您首次执行while时,c是未分配的。

然后,请注意,当读取倒数第二个字符时,您的while测试会通过,导致读取和打印另一个字符 - 因此您将EOF的视觉表示看作最后一个字符。

如果您正在将一个文件传送到此程序中,我怀疑在写入的行之前发生了什么,导致T被省略。

#include <stdio.h> 
    #include <stdlib.h> 

    int main(void) {  
     int c = getchar();  
     while (c != EOF){ 
      printf("%c ",c); 
      c = getchar(); 
     } 
     return (0); 
    } 

编辑:

你可以通过执行类似避免了其他的问题我也建议我们按照user3125367的建议在上面的评论,从而消除了从int到字符一些偷偷摸摸的铸造。我上面编辑过使用int。这也可以让你使用%n来查看文件中第一个字符的实际值,和/或它可以解决问题(即文件中的第一个字符可能看起来像T,但是一个值大于255的非ASCII字符。)

+0

这是一个很好的例子,其中do-while构造可以更有用,更容易阅读而不仅仅是一段时间。 – millinon 2014-10-01 02:49:17

+0

您的解决方案将EOF显示在最后,但第一个字符仍然被省略。 http://gyazo.com/a66ebc666b56cbc381b6ff4bea8408bf – ImBadAtProgramming 2014-10-01 02:52:18

+0

编辑问题向我们展示代码前显示的代码。我认为它必须在那之前发生。 – Dronz 2014-10-01 02:53:24

-2

不知道第一个错误是如何发生的,但是这应该可以解决第二个:

int c; 
for (c = getchar(); c != EOF; c = getchar()) { 
    printf("%c ",c);   
} 

仔细检查,以确保您的文件实际上包含您缺少的第一个字符。

原因你getchar读取字符时使用int是因为EOF常量是一个整数,它是not guaranteed代表一个有效的字符值。因此,当您将角色与EOF进行比较时,即使遇到EOF,与实际EOF常数相比,它也不会评估为真。

您还会注意到,这些功能您使用诸如getcharputchar等,都接受和返回int不是char(我知道,混淆吧?)。我相信这个决定主要是为了在不牺牲珍贵字节的情况下添加对EOF的支持。

+0

http://gyazo.com/15a2e749bc2d0949e20d14583d0ad0ec,你为什么要解决这个问题? – ImBadAtProgramming 2014-10-01 02:42:55

+0

@ImBadAtProgramming c!= EOF; for语句的一部分会阻止EOF打印。 – Dronz 2014-10-01 02:52:16

0

我没有看到任何关于重定向stdin的显着内容。它看起来像你的文本文件有效地具有ASCII字符(是吗 - 没有奇怪的符号?)。该文件可以编码为UTF-8(每个字符最多4个字节)或另一个多字节系统。对于UTF-8,保留ASCII字符的值,即全部小于128,因此它们可以转换为带符号的字符而不会降低精度。一般来说,UTF-8中的字符最多可以有4个字节的大小,因此要求至少存储int的大小。 你的代码有点尴尬,但我没有马上看到它为什么不应该工作,除非char类型是问题。但是,我尝试了int和char,并得到了相同的结果(它工作正常)。这里是我的代码(char类型注释掉):

#include <stdio.h> 
int main() 
{//char c; // Wrong. getchar returns int. 
    int c; 
    while ((c = getchar()) != EOF) printf("%c", c); 
    return 0; 
} 

输出对于任何字符都是一样的;或者int c;如下:

Test line 1 
Test line 2 
Last Line, no CR 

编辑:交流空间表明您input.txt的文件必须被编码为UCS-2(两分字节的Unicode),或类似的东西;由于文本字符值都小于127,因此每个其他字节都为零。因为它们是“不可打印的”,所以零打印为空格。我在这里猜测(没有时间检查)第一条输出线上的前导空间是由于两个字节的BOM(字节顺序标记)导致的,可能是FF FE或FE FF,它们很可能是无法打印。将输入文件保存为UTF-8或ANSI,然后重试。

+0

您是否在发布原始问题后编辑了您的编码?另外,你是否在input.txt中输入了交替空格,或者它们是代码的人工产物? – riderBill 2014-10-01 14:09:35

+0

这是C或C++代码吗?什么OS?使用标签。 – riderBill 2014-10-01 14:11:20