使用fscanf读取C中的坐标时出现问题

使用fscanf读取C中的坐标时出现问题,c,segmentation-fault,coordinates,scanf,C,Segmentation Fault,Coordinates,Scanf,我知道有人问过类似的问题,但似乎没有一个能解决我的问题。当我运行代码时,我得到了分段错误核心 data.dat中的第一行是文件中的点总数,下一行是二维点坐标。我使用fgets读取第一行,然后使用fscanf读取下一行 这是我的密码: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int n = atoi(argv[1]); FILE *fp; f

我知道有人问过类似的问题,但似乎没有一个能解决我的问题。当我运行代码时,我得到了分段错误核心

data.dat中的第一行是文件中的点总数,下一行是二维点坐标。我使用fgets读取第一行,然后使用fscanf读取下一行

这是我的密码:

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

int main(int argc, char *argv[]) {
    int n = atoi(argv[1]);
    FILE *fp;
    fp = fopen("data.dat","r");
    if (fp == NULL) {
        perror("Error");
    }

    int number;
    char str[3];

    fgets(str, 3, fp);
    number = atoi(str); // number of points to read from the file
    printf("number of lines: %d\n", number);

    // defining matrix to hold points
    float *P = (float *) malloc(sizeof(float)*2*number);

    int i = 0;
    while(i < number){
        int ret = fscanf(fp, "%f%f", P[i*number + 1], P[i*number + 2]);
        printf("%f  %f", P[i*number + 1], P[i*number + 2]);
        if (ret == 2){
            i++;
        }
    }
    fclose(fp);
    return 0;
}
我真的不明白,因为我把参数3定义为float

我使用命令行变量运行代码,因此分段错误不是因为这个。

如果变量是双精度的,则需要使用%lf说明符,并且必须将变量的地址传递给scanf,而不是变量本身,如下所示

double value;

if (scanf("%lf", &value) == 1) 
{   /*        ^   ^ */
    /*        |   the address of operator. */
    /*       the correct speficier for `double' */
    fprintf(stdout, "%lf\n", value);
}
如果变量是双精度的,则需要使用%lf说明符,并且必须将变量的地址传递给scanf,而不是变量本身,如下所示

double value;

if (scanf("%lf", &value) == 1) 
{   /*        ^   ^ */
    /*        |   the address of operator. */
    /*       the correct speficier for `double' */
    fprintf(stdout, "%lf\n", value);
}
应该是

while (2 == fscanf(fp, "%f%f", &P[i], &P[i+1]) {
    i += 2;
    if (i >= number*2)
        break;
}
应该是

while (2 == fscanf(fp, "%f%f", &P[i], &P[i+1]) {
    i += 2;
    if (i >= number*2)
        break;
}
主要问题回答得很好

以下是其他要点

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

int main(int argc, char *argv[]) {
    // Check argc 
    if (argc < 1) Print_Error_And Quit();
    int n = atoi(argv[1]);
    FILE *fp;
    fp = fopen("data.dat","r");
    if (fp == NULL) {
        perror("Error");
    }

    int number;
    char str[3];

    // avoid naked magic numbers
    // fgets(str, 3, fp);
    fgets(str, sizeof str, fp);
    number = atoi(str); // number of points to read from the file
    printf("number of lines: %d\n", number);

    // defining matrix to hold points
    // No need for cast, avoid mis-match type/variable
    // float *P = (float *) malloc(sizeof(float)*2*number);
    float *P = malloc(2*number * sizeof *P);

    int i = 0;
    while(i < number){
        // int ret = fscanf(fp, "%f%f", P[i*number + 1], P[i*number + 2]);
        // reform
        int ret = fscanf(fp, "%f%f", &P[2*i], &P[2*i + 1]);
        // printf("%f  %f", P[i*number + 1], P[i*number + 2]);
        printf("%f  %f ", P[2*i], P[2*i + 1]);
        if (ret == 2){
            i++;
        }
        else {
          Likely_Should_Exit_Loop();
        }
    }
    fclose(fp);
    return 0;
}
主要问题回答得很好

以下是其他要点

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

int main(int argc, char *argv[]) {
    // Check argc 
    if (argc < 1) Print_Error_And Quit();
    int n = atoi(argv[1]);
    FILE *fp;
    fp = fopen("data.dat","r");
    if (fp == NULL) {
        perror("Error");
    }

    int number;
    char str[3];

    // avoid naked magic numbers
    // fgets(str, 3, fp);
    fgets(str, sizeof str, fp);
    number = atoi(str); // number of points to read from the file
    printf("number of lines: %d\n", number);

    // defining matrix to hold points
    // No need for cast, avoid mis-match type/variable
    // float *P = (float *) malloc(sizeof(float)*2*number);
    float *P = malloc(2*number * sizeof *P);

    int i = 0;
    while(i < number){
        // int ret = fscanf(fp, "%f%f", P[i*number + 1], P[i*number + 2]);
        // reform
        int ret = fscanf(fp, "%f%f", &P[2*i], &P[2*i + 1]);
        // printf("%f  %f", P[i*number + 1], P[i*number + 2]);
        printf("%f  %f ", P[2*i], P[2*i + 1]);
        if (ret == 2){
            i++;
        }
        else {
          Likely_Should_Exit_Loop();
        }
    }
    fclose(fp);
    return 0;
}

malloc行返回一个指针,指向一个足以容纳“number*2”浮动的区域。听起来不错,但实际上不会正常工作,因为一个浮点数和下一个浮点数之间没有区别

暗示

struct twoFloat
{
    float float1;
    float float2;
};
然后

然后


malloc行返回一个指针,指向一个足以容纳“number*2”浮动的区域。听起来不错,但实际上不会正常工作,因为一个浮点数和下一个浮点数之间没有区别

暗示

struct twoFloat
{
    float float1;
    float float2;
};
然后

然后


如果您正在扫描三位数字,您会遇到一个非常大的问题,即您的字符数组正好有3个字节长。您必须允许null终止,否则您的atoi将运行超过边界。请发布一些示例输入数据并尝试对其进行描述。代码正在向fscanf传递浮点。fscanf不需要知道浮点值,它需要知道存储结果的浮点地址。使用fscanffp,%f%f,&P[i*number+1]。。。添加&注意:编译时还有许多其他问题,请始终启用所有警告。然后修复警告。毕竟,编译器比我们人类更了解C语言,人类也容易犯错。建议阅读fscanf手册页,其中会告诉您变量必须是指针。建议使用调试器(如“gdb”)逐步检查代码,以确定导致seg故障事件的具体行。然后,您可以检查该行并继续执行事件,以确定seg故障事件的原因。如果您正在扫描三位数字,您会遇到一个非常大的问题,即您的字符数组正好有3个字节长。您必须允许null终止,否则您的atoi将运行超过边界。请发布一些示例输入数据并尝试对其进行描述。代码正在向fscanf传递浮点。fscanf不需要知道浮点值,它需要知道存储结果的浮点地址。使用fscanffp,%f%f,&P[i*number+1]。。。添加&注意:编译时还有许多其他问题,请始终启用所有警告。然后修复警告。毕竟,编译器比我们人类更了解C语言,人类也容易犯错。建议阅读fscanf手册页,其中会告诉您变量必须是指针。建议使用调试器(如“gdb”)逐步检查代码,以确定导致seg故障事件的具体行。然后,您可以检查该线路并继续执行事件,以确定seg故障事件的原因。Hmmm float*P?这是一个解决问题,而不是浮动v。双HMMM浮点*P?这是一个解决问题,而不是浮动v。我不明白你说的浮动和浮动之间没有区别是什么意思。你能用calirfy吗?谢谢。我不明白你说的浮动和浮动之间没有区别是什么意思。你能用calirfy吗?谢谢