未从主函数调用函数

Function not getting called from the main function

我非常担心我不了解 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, "%d", &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, "%d", &number) != 1) 
{
    printf("Scanf error\n");
    exit(0);
}

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

  • 您将 number 的地址而不是其值传递给 isPrime
  • 您应该迭代 while (fscanf(fp, "%d", &number) == 1) 来处理文件中的所有数字。您当前的循环逻辑很麻烦,如果第一个数字 0 或文件包含相同的连续数字,则会失败。
  • 在 C 语言中,仅测试 isPrime 的 return 值是否为非零是惯用的。
  • 复合数字的消息不正确。
  • 退出状态的约定对于失败是非零的。
  • 你应该取负数的绝对值。
  • 你应该 return 0 因为 01 不被认为是质数。
  • 您可以通过测试 i * i <= number 而不是 i < number 来提高 isPrime 对于大数的性能,将复杂度降低到 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, "%d", &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;
}