C 程序可编译但永远运行,并在调用函数时停止

C 程序可编译但永远运行,并在调用函数时停止,c,C,程序在gcc中编译,但在调用countEven()之前变为空白并永远运行。我相信在阅读文件时有问题,但我不太确定。我似乎无法克服这个问题,它似乎是持久的其他问题,我将稍后上传。如果有人有时间想帮我的话,今晚我还有一些更具体的问题需要帮助 该函数用于读取文件,标记整个文件,并检查每个标记是否为偶数 #include <stdio.h> #include <stdlib.h> #include <string.h> unsigned int countEven(

程序在gcc中编译,但在调用countEven()之前变为空白并永远运行。我相信在阅读文件时有问题,但我不太确定。我似乎无法克服这个问题,它似乎是持久的其他问题,我将稍后上传。如果有人有时间想帮我的话,今晚我还有一些更具体的问题需要帮助

该函数用于读取文件,标记整个文件,并检查每个标记是否为偶数

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

unsigned int countEven(char strFileName[])
{
    FILE *pFile;
    char buffer[80];
    char delim[] = " ,\t\n";
    char* token;
    int numb;
    unsigned int count = 0;
    
    pFile = fopen(strFileName, "r");
    
    if (pFile == NULL)
        printf("ERROR: the file is invalid");
    
    while(fgets(buffer, sizeof(buffer), pFile) != NULL)
    {
        token = strtok(buffer,delim);
        
        while(token != NULL)
        {
            numb = atoi(token);
            
            if((numb%2)==0)
                count++;
            
            token = (NULL, delim);
        }
        
        fclose(pFile);
    }
    
    return count;
}

int main(int argc, char* argv[])
{
    unsigned int numbEven = 0;
  
    printf("the file is %s \n", argv[1]);
    numbEven = countEven(argv[1]);
   
    printf("the number of even digits is %u \n", numbEven);
    return(EXIT_SUCCESS);
}
#包括
#包括
#包括
无符号整数偶数(字符strFileName[])
{
文件*pFile;
字符缓冲区[80];
字符delim[]=“,\t\n”;
字符*令牌;
智力麻木;
无符号整数计数=0;
pFile=fopen(strFileName,“r”);
if(pFile==NULL)
printf(“错误:文件无效”);
while(fgets(buffer,sizeof(buffer),pFile)!=NULL)
{
令牌=strtok(缓冲区,delim);
while(令牌!=NULL)
{
numb=atoi(令牌);
如果((编号%2)=0)
计数++;
令牌=(NULL,delim);
}
fclose(pFile);
}
返回计数;
}
int main(int argc,char*argv[])
{
无符号整数n=0;
printf(“文件是%s\n”,argv[1]);
numberven=偶数(argv[1]);
printf(“偶数位数为%u\n”,numberven);
返回(退出成功);
}
这是一条包含逗号运算符(a)的语句,它基本上将
标记设置为指向
delim
字符串,因此它永远不会变为
NULL
,从而导致无限循环。您需要的是:

token = strtok(NULL, delim);
除此之外,您正在读取和处理该文件行的循环中关闭该文件(或者,如果您没有陷入无限循环中,您将被关闭)。您可能希望在循环之后执行此操作(将
fclose
与紧跟其后的右大括号交换)

main()
中盲目使用
argv
之前,最好先检查
argc
。目前,在没有任何filename参数的情况下运行程序很可能会导致问题,因为
argv[1]
NULL

最后,还有一些其他需要警惕的事情:

  • 如果行数大于78个字符(换行符和字符串终止符需要空间),则此操作将无法正常工作。具体地说,如果你有一个像
    1234 | 567
    这样的数字在这个边界上(
    |
    是边界),你将得到它的第一部分的偶数状态,尽管它是奇数
  • 任何非数字标记将由
    atoi
    转换为零
如果您只有数字标记,并且行足够短,那么这两个都不重要,但必须记住这一点



(a) 表达式
a,b
同时计算
a
b
,但结果只是
b

您可能需要阅读以下两个链接:1。2. <代码>标记=(NULL,delim)看起来有问题。代码在读取第一行后关闭文件。此外,您正在关闭循环中的文件。当你第二次阅读时,你将从一个关闭的文件中阅读,这肯定会被打破。谢谢你修复了它。但是,该函数仍不计算文件中的偶数。我怎样才能解决这个问题?atoi()有问题吗?
token = strtok(NULL, delim);