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