gpt4 book ai didi

c - 尝试计算 C 中的字符、单词和行数

转载 作者:行者123 更新时间:2023-11-30 19:47:53 24 4
gpt4 key购买 nike

所以作业是用 C 语言模拟 unix 命令 wc。我已经掌握了大部分结构,但在实际计数方面遇到了一些问题。

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

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

int file;
int newLine=0, newWord=0, newChar=0, i=0;
char *string;
char buf[101];

file = open(argv[1], O_RDONLY, 0644);

int charRead=read(file, buf, 101);

if (file == -1){
printf("file does not exist");
}
else{
for (i; i<100; i++){
if (buf[i]!='\0'){
newChar++;
}
if (buf[i]==' '){
newWord++;

}
if (buf[i]=='\n'){
newLine++;
}

}
}
printf("%d\n",newWord);
printf("%d\n",newLine);
printf("%d\n",newChar);
printf("%s",argv[1]);
close(file);

}

所以线路计数器工作得很好。

除非单词末尾有空格,否则字数始终为短。我试图通过特殊情况来改善这个问题:

if(buf[i]!='\0' || (buf[i]=='\0' && buf[i]!=' '))

但这似乎也不起作用。

另一个问题是字符数总是相差很多。我认为这与缓冲区大小有关,但我似乎找不到太多关于如何使缓冲区在这种情况下工作的文档。

请指教。谢谢!

最佳答案

编辑我查看了“重复”问题中给出的答案,我认为它们并没有真正解决您的问题。我编写了一个简短的程序,可以执行您想要的操作(并且“安全”,因为它可以处理任何大小的输入)。我针对一个短文件对其进行了测试,它给出了与 wc 相同的结果。

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
// count characters, words, lines
int cCount = 0, wCount = 0, lCount = 0, length;
char buf[1000];
FILE *fp;

if (argc < 2) {
printf("usage: wordCount fileName\n");
return -1;
}

if((fp = fopen(argv[1], "r")) == NULL) {
printf("unable to open %s\n", argv[1]);
return -1;
}

while(fgets(buf, 1000, fp)!=NULL) {
int ii, isWord, isWhite;
lCount++;
isWord = 0;
length = strlen(buf);
cCount += length;
for(ii = 0; ii<length; ii++) {
isWhite = (buf[ii]!=' ' && buf[ii]!= '\n' && buf[ii] != '\t') ? 1 : 0;
if (isWhite == 1) {
if(isWord != 1) wCount++;
isWord = 1;
}
if(isWhite == 0 && isWord == 1) {
isWord = 0;
}
}
}
printf("Characters: %d\nWords: %d\nLines: %d\n\n", cCount, wCount, lCount);
return 0;
}

注意 - 如果一行中的字符超过 1000 个,以上可能会给出错误结果;这可以通过使用 getline() 来解决,这是一个非常安全(但非标准)的函数,它将负责为读入的行分配足够的内存。我认为您不需要在这里担心它。如果您确实担心它,您可以使用与上面相同的技巧(其中您有“isWord”状态)并将其扩展为 isLine (当您遇到 \n)。那么您就不需要内部 for 循环。它的内存效率稍高,但速度较慢。

关于c - 尝试计算 C 中的字符、单词和行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com