【问题标题】:Reading from a redirected stdin (wordcount) - C从重定向的标准输入(字数)读取 - C
【发布时间】:2014-10-01 23:51:02
【问题描述】:

我有一个名为“input.txt”的文本文件,其中包含:

test line one
test line two
final line

编译运行后通过

$ ./a.exe < input.txt

我得到了输出:

33 8 0

我很困惑为什么行数不起作用,因为当我打印出整数值时,显示了 13 和 10(回车/换行)。 charcount 也是实际计数的两倍。有什么想法吗?

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

    int main(void) { 
        int charcount = 0, wordcount = 0, linecount = 0; 
        int c = getchar();    

        while (c != EOF){
            if (c == 13){
                linecount++;
                c = getchar();
            } else if (c >= 65 && c <= 90 || c >= 97 && c <= 122 || c == 39 && c != 13) {  
                while (c >= 65 && c <= 90 || c >= 97 && c <= 122 || c == 39 && c != 13){
                    charcount++;                
                    c = getchar();
                }
                wordcount++;
            } else {
                charcount++;
            }
            c = getchar(); 
        }

        printf("%lu %lu %lu\n", charcount, wordcount, linecount);

        return (0);
    }

【问题讨论】:

  • 不要忘记换行符也是字符。标准的wc 程序当然会计算它们;你的代码可能也应该。在 Unix 上,您的文件有两行 13 个字符,一行 10 个字符,外加 3 个换行符,总共 39 个字符;在 Windows 上,文本文件似乎也有 39 个字符,但如果将其视为二进制文件,则在磁盘或文件中将有 42 个字符。

标签: c redirect stdin


【解决方案1】:

当在 C 中处理 Windows 上的文本文件时,CRLF 行尾仅映射到 '\n'(换行符)结尾。 '\n' 是 10 (Control-J) 而不是 13 (Control-M)。这可能就是您看到行数为 0 的原因。

你不应该像以前那样编写条件代码(除非你有一个虐待狂的老师告诉你那样做)。使用&lt;ctype.h&gt;isalpha()(和c == '\'' 而不是39)。

您可以通过在if (c == 13) 代码中添加打印语句 (printf("^M read\n");) 进行调试。

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 2012-03-24
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多