未从主函数调用函数
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
因为 0
和 1
不被认为是质数。
- 您可以通过测试
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;
}
我非常担心我不了解 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
因为0
和1
不被认为是质数。 - 您可以通过测试
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;
}