尝试使用fscanf时出现分段错误

时间:2015-04-26 22:39:06

标签: c

在这个程序中,我尝试从文件中读取double和char数组,并打印出比参数中输入的值多一倍的行。它编译得很好但是当我运行它时我得到错误:分段错误(核心转储)

这是程序

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

int main (int argc, char **argv[]) {


if(argc != 2)
        printf("enter 2 arguments\n");
else {
        int r;
        double tDate = atof(*argv[1]);
        double date = 0;
        char event[] = "";
        FILE *fp = fopen("tickler.dat","r");

        if( fp == NULL ) {
                perror("Error while opening the file.\n");
                exit(EXIT_FAILURE);
        }

        while(r = fscanf(fp, "%lf %s\n", &date, event) != EOF) {

                if(date > tDate)
                        printf("%d - %s", date, event);
        }

        fclose(fp);
}
return 0;
}

这是文件,&#34; Tickler.dat&#34;

150410 DR_APPOINTMENT
150420 MATH_DUE
150426 MEETING
150511 PRINT_HW

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这一行case goodEmail是正确的还是

int main (int argc, char **argv[])

答案 1 :(得分:1)

除了在评论和其他答案中诊断出的许多其他问题,这一行也不正确:

while(r = fscanf(fp, "%lf %s\n", &date, event) != EOF) {

你需要:

while ((r = fscanf(fp, "%lf %s\n", &date, event)) != EOF) {

测试应该是:

while ((r = fscanf(fp, "%lf %s\n", &date, event)) == 2) {

除非您计划处理例如字母字符,其中您期望一个数字(以便r == 0返回后fscanf())。

OTOH,既然您已分配但实际上并未使用r,则可以将代码简化为:

while (fscanf(fp, "%lf %s\n", &date, event) == 2) {

如果你给event一个合适的尺寸(大于你现有的1),那么你应该写:

char event[32];

while (fscanf(fp, "%lf %31s\n", &date, event) == 2) {

以避免缓冲区溢出。请注意,格式字符串中指定的大小与声明的大小之差为1。或者,在支持POSIX 2008的系统上,您可以使用:

char *event = 0;

while (fscanf(fp, "%lf ^ms\n", &date, &event) == 2) {
    …code using event…
    free(event);
}

m告诉fscanf()分配内存,传递的值为char **,如图所示。如果扫描失败,则无需释放。