我知道有几个人已就这个话题提出过要求,但似乎这些问题要么没有完全回答,要么难以应用于我的代码,所以如果这是重复,我会道歉。 我在整个I / O程序中遇到以下功能时出现问题,该程序也执行字和行计数(这些工作)。 char * filename从命令行中提取。在这个例子中,它是从带有lorum ipsum的txt文件中提取的。 (69字)理论上,下面的函数应该从filename读取并将其写入数组。然后读取该数组并检查当前字符是否为空格' '而下一个角色不是。它无论如何都会返回0.
int wordcount(char* filename) {
int wc=0,i=0,z=0;
char w, test[1000];
FILE *fp;
fp = fopen(filename, "r");
while (feof(fp) == 0) {
fscanf(fp, "%c", &test[i]);
i++;
}
while (z>i-1) {
if (test[z] = ' ' && test[z+1] != ' ' ) {
wc++;z++;
}
}
return wc;
}
注意:我知道声明一个1000字符数组是非常低效的,但我不确定如何做到这一点。如果您有任何改进或其他方法来实现这一点,如果您分享,将不胜感激。此外,我知道这当前忽略了其他类型的空白,但我只是先测试它,然后再扩展。
感谢您的帮助。
答案 0 :(得分:0)
为什么总是得到0个字的结果的具体问题:
while (z>i-1) {
z
永远不会超过i-1
。可能你想在z
小于i-1
时循环:
while (z<i-1) {
此外,只有在找到单词时才会增加z
。你应该为你测试的每个角色增加它,无论它是否是空格。
答案 1 :(得分:0)
有一个示例功能可以满足您的需求。对于代码的一些建议,fopen()必须在不再需要文件时跟随fclose()。始终检查fopen返回的指针是否为NULL并且在这种情况下什么都不做,只返回错误代码。可以通过空格字符安全地检测新单词的存在,后跟非空格字符,在这种情况下,增量世界计数++ wc。使用getc()从文件对象中读取一个字符,并使用isspace()函数检查字符是否为空格。如果没有人在worldcount运行期间修改该文件,则不需要数组来存储文件。
int wordcount(const char* filename)
{
int wc=0;
char c;
FILE *fp;
fp = fopen(filename, "r");
if(fp == NULL)
{
return -1;
}
bool previsspace = 1;
while ((c=getc(fp)) != EOF)
{
if (isspace(c)==0 && (previsspace==1)) ++wc;
previsspace = isspace(c);
}
fclose(fp);
return wc;
};
您需要以下包含文件:
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>