C-C文件赢得';t计数不正确,短了1

C-C文件赢得';t计数不正确,短了1,c,methods,C,Methods,我是C语言的新手,正在努力学习一些语法。我的目标是通读目录中的文本文档,并返回其长度的计数 #include <stdio.h> #include <stdio.h> #include <ctype.h> int counter (FILE* inPtr) { //Pointer to the file its reading from char ln[len]; \\length of file int counter = 0; \\init

我是C语言的新手,正在努力学习一些语法。我的目标是通读目录中的文本文档,并返回其长度的计数

#include <stdio.h>
#include <stdio.h>
#include <ctype.h>

int counter (FILE* inPtr) { //Pointer to the file its reading from
   char ln[len]; \\length of file
   int counter = 0;  \\initializing file

while(fgets(ln,len,inPtr) != NULL{
    char* r;
for (r = ln; *r != '0';) {
   while (isspace(*run)) {
      r++;
 }
 if(*r == '\0') {
      break; 
}
 else {
     counter++; 
}
  r++;
}
return(counter);
}
}
#包括
#包括
#包括
int计数器(FILE*inPtr){//指向从中读取的文件的指针
char ln[len];\\n文件长度
int计数器=0;\\n正在初始化文件
while(fgets(ln,len,inPtr)!=NULL{
char*r;
对于(r=ln;*r!=“0”;){
while(isspace(*run)){
r++;
}
如果(*r=='\0'){
打破
}
否则{
计数器++;
}
r++;
}
退货(柜台);
}
}

基本上,我只是试着越过单词之间的空格,当我们越过长度时(当它运行到null时)中断,然后一边计数。然后它一直运行,直到它指向无空格或null。我想我的想法是正确的,语法是关闭的……有什么建议吗?

代码中有许多语法问题:

  • 您包括两次
  • 单行注释以
    /
    开头,而不是
    \\
  • 空指针定义为
    null
    ,而不是
    null
  • 中缺少
    ,而(fgets(ln,len,inPtr)!=null{
  • if(*r=='\0');{
  • 如果
    循环的
    ,您可能想测试
    *r!='\0'
    ,而不是
    *r!='0'
  • 您应该将
    返回计数器;
    移动到
    while
    循环的主体之外
以下是经过修改、重新格式化和简化的版本:

#包括
#包括
int计数器(FILE*inPtr){//指向从中读取的文件的指针
字符项次[256];//行缓冲区
int counter=0;//文件中的非空白字符数
while(fgets(ln,sizeof(ln,inPtr)!=NULL){
对于(char*r=ln;*r!='\0';r++){
if(!isspace((无符号字符)*r)){
计数器++;
}
}
}
返回计数器;
}
下面是一个更简单的版本,一次读取一个字节:

#包括
#包括
//从当前位置返回文件中的非空白字符数
int计数器(FILE*inPtr){//指向从中读取的文件的指针
int c,计数器=0;
而((c=getc(inPtr))!=EOF){
计数器+=!isspace(c);
}
返回计数器;
}
如果您的目的是计算字数而不是字节数,则应将其修改为跳过空白,在行尾测试是否,增加字数并跳过
循环体中的所有非空白字节:

// return the number of space separated words in the file
int counter(FILE *inPtr) { // Pointer to the file its reading from
    char ln[256];     // line buffer
    int counter = 0;  // number of space separated words in the file

    while (fgets(ln, sizeof(ln), inPtr) != NULL) {
        for (char *r = ln;;) {
            // skip white space before the word
            while (isspace((unsigned char)*r) {
                r++;
            }
            if (*r == '\0')  // end of the line
                break;
            counter++;  // count the word
            // skip the word
            while (*r != '\0' && !isspace((unsigned char)*r) {
                r++;
            }
        }
    }
    return counter;
}

错误消息是什么?因为给定的代码无法编译。@billybob 1)C中的注释不使用\\。请发布真实的代码。2)仔细查看
if(*r=='\0');
直到你看到不属于你的东西。一定要学会将你的代码缩进到与其块嵌套相对应的深度。这会使程序结构更容易理解。@billybob不要发布“仅用于此处”代码。发布真实代码,否则你就浪费了每个人的时间,也浪费了你的时间。@billybob如果这是真实代码,你会在忘记替换
运行
的行上出错。真实代码意味着复制粘贴你(尝试)的内容编译。这一切都已修复。代码按需要运行。但是,还有最后一个问题。计数器短1,它没有说明某些内容,可能在结尾?您能提供帮助吗?@billybob:如上所述,它返回文件中从当前位置到文件结尾的非空白字节数。这是您的意图吗?注意行终止序列被认为是空白,并且
EOF
不是一个字节,也不是文件的一部分。我很感激这一点。这意味着很多。但是,根据我上面提供的内容,我必须问一下,你能告诉我为什么它在计数器中返回的值比它应该/预期的少一个吗?我可以看到你做了什么来清理它…我很抱歉我可以修改我的代码直到第一个for循环(这是一个提供的框架框架)。但是,我想知道在我的框架下是什么让它在return中少了一个基本上,代码需要输入一个测试文件(在另一个函数中处理)它将返回单词总数。这就是它所需要的。@billybob:没有完整的程序和调用序列,很难判断发生了什么。