Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编译器错误:";指针和整数之间的比较;。_C_Compiler Errors_Scanf - Fatal编程技术网

C编译器错误:";指针和整数之间的比较;。

C编译器错误:";指针和整数之间的比较;。,c,compiler-errors,scanf,C,Compiler Errors,Scanf,在过去几天中,我使用fscanf()完成了一些程序,但没有收到此错误。它位于while循环条件语句的第21行。程序接受从控制台传递的第二个参数,这是一个包含非常大的mersenne素数的文件,并将内容读入程序。从那里,我将数字的总计数以及每个不同可能数字(即0、1、2等)的计数相加,然后将结果打印到控制台。任何帮助都将不胜感激 #include <stdio.h> int main(int argc, char* argv[]) { FILE *file;

在过去几天中,我使用fscanf()完成了一些程序,但没有收到此错误。它位于while循环条件语句的第21行。程序接受从控制台传递的第二个参数,这是一个包含非常大的mersenne素数的文件,并将内容读入程序。从那里,我将数字的总计数以及每个不同可能数字(即0、1、2等)的计数相加,然后将结果打印到控制台。任何帮助都将不胜感激

#include <stdio.h>

int main(int argc, char* argv[])
{
        FILE *file;
        int digit;
        unsigned long int zeros = 0;
        unsigned long int ones = 0;
        unsigned long int twos = 0;
        unsigned long int threes = 0;
        unsigned long int fours = 0;
        unsigned long int fives = 0;
        unsigned long int sixes = 0;
        unsigned long int sevens = 0;
        unsigned long int eights = 0;
        unsigned long int nines = 0;
        unsigned long int total = 0;

        file = fopen(argv[1], "r");

        while (fscanf(file, "%d", &digit) != NULL)
        {
                if (digit == 0)
                {
                        zeros += 1;
                }

                else if (digit == 1)
                {
                        ones += 1;
                }
                else if (digit == 2)
                {
                        twos += 1;
                }
                else if (digit == 3)
                {
                        threes += 1;
                }
                else if (digit == 4)
                {
                        fours += 1;
                }
                else if (digit == 5)
                {
                        fives += 1;
                }
                else if (digit == 6)
                {
                        sixes += 1;
                }
                else if (digit == 7)
                {
                        sevens += 1;
                }
                else if (digit == 8)
                {
                        eights += 1;
                }
                else if (digit == 9)
                {
                        nines += 1;
                }
                total += 1;
        }

        printf("0s: %u\n1s: %u\n2s: %u\n3s: %u\n4s: %u\n5s: %u\n6s: %u\n7s: %u\n8s: %u\n9s: %u\nTotal: %u\n", zeros, ones, twos, threes, fours, fives, sixes, sevens, eights, nines, total);

        fclose(file);

        return 0;
}
#包括
int main(int argc,char*argv[])
{
文件*文件;
整数位数;
无符号长整型零=0;
无符号长整数=0;
无符号长整数twos=0;
无符号长整数三=0;
无符号长整数四=0;
无符号长整数五=0;
无符号长整数=0;
无符号长整数七=0;
无符号长整数=0;
无符号长整数=0;
无符号长整型合计=0;
file=fopen(argv[1],“r”);
while(fscanf(文件,'%d',&digit)!=NULL)
{
如果(数字==0)
{
零+=1;
}
else if(数字==1)
{
1+=1;
}
否则如果(数字==2)
{
twos+=1;
}
否则如果(数字==3)
{
三s+=1;
}
否则如果(数字==4)
{
四个+=1;
}
否则如果(数字==5)
{
五个+=1;
}
否则如果(数字==6)
{
六+=1;
}
否则如果(数字==7)
{
七+=1;
}
否则如果(数字==8)
{
八个+=1;
}
否则如果(数字==9)
{
9+=1;
}
总数+=1;
}
printf(“0s:%u\n1s:%u\n2s:%u\n3s:%u\n4s:%u\n5s:%u\n6s:%u\n7s:%u\n8s:%u\n9s:%u\n总计:%u\n”,零、一、二、三、四、五、六、七、八、九、总计);
fclose(文件);
返回0;
}

fscanf的返回类型为
int
。因此,编译器抱怨使用:

    while (fscanf(file, "%d", &digit) != NULL)
将其更改为:

    while (fscanf(file, "%d", &digit) == 1)

fscanf
的返回类型为
int
。因此,编译器抱怨使用:

    while (fscanf(file, "%d", &digit) != NULL)
将其更改为:

    while (fscanf(file, "%d", &digit) == 1)


@R Sahu谢谢你的帮助。这确实允许程序编译。如果你不介意的话,我还有一个问题。各个数字计数在输出中均显示为零。为什么计数器不继续累加计数的总和?@seeuuaye08,变量的类型为
无符号长整型
。您应该使用
%lu
格式而不是
%u
来打印它们。@seeuuaye08我想我对您的主要问题的第二个评论可以解释为什么您的计数都是zero@RSahu我已经编辑了它,它仍然为每一个生成一个零值digit@seeuuaye08,看起来您看到了M.M警告您的问题。您可以添加一个
printf
行来打印
digit
,以帮助您调试问题。@R Sahu感谢您的帮助。这确实允许程序编译。如果你不介意的话,我还有一个问题。各个数字计数在输出中均显示为零。为什么计数器不继续累加计数的总和?@seeuuaye08,变量的类型为
无符号长整型
。您应该使用
%lu
格式而不是
%u
来打印它们。@seeuuaye08我想我对您的主要问题的第二个评论可以解释为什么您的计数都是zero@RSahu我已经编辑了它,它仍然为每一个生成一个零值digit@seeuuaye08,看起来您看到了M.M警告您的问题。您可以添加一个
printf
行来打印
数字
,以帮助您调试问题。注意:您可以大大简化代码:
无符号长整数计数[10]={0}<代码>如果(数字>=0&&digit<10)计数[数字]+=1
如果要从相邻数字串中读取单个数字,则
%d
将不起作用:这会将所有相邻数字视为一个大数字(如果该数字对于
int
而言太大,则会导致未定义行为)。您需要使用
%c
一次读取一个字符(请记住,结果值将在
'0'
'9'
的范围内)。@M.M非常感谢您的建议。这里是我改变的:它不允许我在这里发布代码,所以我只是编辑了原始的帖子。再次感谢。在更新的代码中,
atoi(输入)
是一个错误。
atoi
函数需要以null结尾的字符串,但您没有提供。您可以添加空终止符,或者将行更改为
digit=input[0]-“0”
。注意:您可以大大简化代码:
无符号长整数计数[10]={0}<代码>如果(数字>=0&&digit<10)计数[数字]+=1
如果要从相邻数字串中读取单个数字,则
%d
将不起作用:这会将所有相邻数字视为一个大数字(如果该数字对于
int
而言太大,则会导致未定义行为)。您需要使用
%c
一次读取一个字符(请记住,结果值将在
'0'
'9'
的范围内)。@M.M非常感谢您的建议。我改变的是:它不允许我在这里发布代码,所以我