用 C 语言模拟 WC 命令的程序不起作用

Posted

技术标签:

【中文标题】用 C 语言模拟 WC 命令的程序不起作用【英文标题】:Program in C to Emulate WC command not working 【发布时间】:2014-03-02 04:54:36 【问题描述】:

它应该模拟 WC 命令,但我似乎无法让我的 readFile 方法工作。我认为它与指针有关,但我对 C 很陌生,我仍然不太了解它们。非常感谢你的帮助!以下是源代码:

/*
 *  This program is made to imitate the Unix command 'wc.'
 *  It counts the number of lines, words, and characters (bytes) in the file(s) provided.
 */

#include <stdio.h>

int main (int argc, char *argv[])

    int lines = 0;
    int words = 0;
    int character = 0;
    char* file;
    int *l = &lines;
    int *w = &words;
    int *c = &character;

    if (argc < 2) //Insufficient number of arguments given.
        printf("usage: mywc <filename1> <filename2> <filename3> ...");
    else if (argc == 2)
    
        file = argv[1];
        if (readFile(file, l, w, c) == 1)
        
            printf("lines=%d\t words=%d\t characters=%d\t file=%s\n",lines,words,character,file);
        
    
    else
    
        //THIS PART IS NOT FINISHED. PAY NO MIND.
        //int i;
        //for(i=1; i <= argc; i++)
        //
        //    readFile(file, lines, words, character);
        //
    


int readFile(char *file, int *lines, int *words, int *character)

    FILE *fp = fopen(file, "r");
    int ch;
    int space = 1;

    if(fp == 0)
    
        printf("Could not open file\n");
        return 0;
    

    ch = fgetc(fp);

    while(!feof(fp))
    
        character++;
        if(ch == ' ') //If char is a space
        
            space == 1;
        
        else if(ch == '\n')
        
            lines++;
            space = 1;
        
        else
        
            if(space == 1)
                words++;
           space = 0;
        
        ch = fgetc(fp);
    
    fclose(fp);
    return 1;

【问题讨论】:

调试器告诉你什么?或者,旧的 printf() 声明? main (printf("lines=%d...etc)) 中的 printf() 语句返回全零。我现在添加一些 print 语句来尝试找出问题所在是 【参考方案1】:

在您的 readFile 函数中,您传递的是指针。所以当你增加行时,你是在增加指针,而不是它指向的值。使用语法:

*lines++;

这会取消引用指针并增加它指向的值。字字也一样。

【讨论】:

我刚刚尝试过,但我仍然得到 0 的所有内容 ++ 的优先级高于 *。你想要(*lines)++ 非常感谢!它现在正在工作,除了现在一些计数已经关闭,但这是向前迈出的一大步编辑:修复了。有“==”而不是“=”【参考方案2】:

首先,while(!feof(fp)) 可能有问题。这通常不是推荐的方法,应始终小心使用。

用新功能编辑:

这是另一个获取文件中单词数量的示例:

int longestWord(char *file, int *nWords)

    FILE *fp;
    int cnt=0, longest=0, numWords=0;
    char c;
    fp = fopen(file, "r");
    if(fp)
    
        while ( (c = fgetc ( fp) ) != EOF )
        
            if ( isalnum ( c ) ) cnt++;
            else if ( ( ispunct ( c ) ) || ( isspace ( c ) ) )
            
                (cnt > longest) ? (longest = cnt, cnt=0) : (cnt=0);
                numWords++;
            
        
        *nWords = numWords;
        fclose(fp);
    
    else return -1;

    return longest+1;

注意:这也会返回最长的字,这在确定分配多少空间时很有用例如,将文件的所有单词放入字符串数组中。

【讨论】:

以上是关于用 C 语言模拟 WC 命令的程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥“#define WC(p) L#p”在 GCC 和 Clang 中不起作用?

开玩笑 - 用“模拟”前缀模拟不起作用

多管道C程序不起作用

iOS模拟器更改设备不起作用

iOS 目标 c 框架在模拟器中不起作用

我用 C 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。 10^10 不起作用,发生了啥?