用 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 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。 10^10 不起作用,发生了啥?