无法从主函数调用函数

问题描述

我非常担心我不了解C编程的基本原理。我正在从文本文件中读取数字,我将检查它们是否为质数。但是,问题在于,从未从IsPrime函数中调用main函数。我尝试使number变量成为全局变量和局部变量,但是它不起作用。我的基本知识是否很糟糕?

从文本文件读取没有问题。看起来像这样:

73771782    81296771    79982326    75332246    10128193
81643413    76259734    94432076    50063976    91748657
42311916    -1920042    90747362    53851612    43498487
73193311    96685173    39019033    8630045     17

由于main函数从不调用IsPrime函数,其结果是所有数字都被打印为is a prime number

代码如下:

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

int isPrime(int number);

int main(int argc,char **argv) {
    int number = 0;
    int number2 = 0;
    FILE *fp = NULL;
    
    char file_name[] = "C:\\Users\\Erlen\\Desktop\\numbers.txt";
    fp = fopen(file_name,"r"); 
    
    if (fp == NULL) {
        printf("Error opening the file: \n");
        exit(0);
    }
    
    fscanf(fp,"%d",&number);
    
    while (number != number2) {
        if (isPrime(&number) == 1) {
            printf("Number: %d is a prime number \n",number);
        } else {
            printf("The number %d is a prime number \n",number);
        }
        number2 = number;
        fscanf(fp,&number);
    }
    printf("\n");
    
    return 0;
}

int isPrime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            return 0;
        }
    }
    return 1;
}

解决方法

isPrime(&number),您传递变量number的地址,而不是其值。更改为isPrime(number)

检查scanf的结果。 fscanf(fp,"%d",&number); =>

if(fscanf(fp,&number) != 1) 
{
    printf("Scanf error\n");
    exit(0);
}
,

您的代码中存在多个问题:

  • 您将number的地址而不是其值传递给isPrime
  • 您应该迭代while (fscanf(fp,&number) == 1)以处理文件中的所有数字。您当前的循环逻辑很麻烦,如果第一个数字为0或文件包含相同的连续数字,则会失败。
  • 在C语言中习惯仅测试isPrime的返回值是否为非零。
  • 综合数字消息不正确。
  • 对于失败,退出状态的约定不为零。
  • 您应该采用负数的绝对值。
  • 您应该为00返回1,它们不被视为素数。
  • 您可以通过测试用isPrime而不是i * i <= number来提高i < number的性能,将复杂度降低到 O(sqrt(N))

这是修改后的版本:

#include <stdio.h>

int isPrime(int number);

int main(int argc,char *argv[]) {
    int number;
    FILE *fp;
    char file_name[] = "C:\\Users\\Erlen\\Desktop\\numbers.txt";

    fp = fopen(file_name,"r"); 
    if (fp == NULL) {
        printf("Error opening the file: \n");
        return 1;
    }
    
    while (fscanf(fp,&number) == 1) {
        if (isPrime(number)) {
            printf("Number %d is a prime number\n",number);
        } else {
            printf("Number %d is a not a prime number\n",number);
        }
    }
    return 0;
}

int isPrime(int number) {
    if (number < 0)
        number = -number;
    if (number < 2)
        return 0;
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            return 0;
        }
    }
    return 1;
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...