【问题标题】:Segmentation fault while trying to use fscanf尝试使用 fscanf 时出现分段错误
【发布时间】:2015-04-26 22:39:05
【问题描述】:

在这个程序中,我试图从文件中读取一个双精度和一个字符数组,并打印出双精度值大于输入参数的行。它编译得很好,但是当我运行它时出现错误:Segmentation fault(core dumped)

这是程序

#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;
}

这是文件,“Tickler.dat”

150410 DR_APPOINTMENT
150420 MATH_DUE
150426 MEETING
150511 PRINT_HW

任何帮助将不胜感激。

【问题讨论】:

  • 数组event[]有多大?多少个字符?
  • 另外,也是学习使用调试器的好时机。在这种(以及许多其他)情况下非常有帮助。
  • 除了上述 cmets :根据this reply,您应该在 fscanf 中使用 %lf,您已经在使用,在 printf 中使用 %f。参考@Angel Angel 的评论和我的回复。

标签: c


【解决方案1】:

int main (int argc, char **argv[]) 这一行是正确的或

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

【讨论】:

  • 我建议 OP 也将 atof(*argv[1]) 替换为 atof(argv[1])。
【解决方案2】:

以及在 cmets 和其他答案中诊断出的许多其他问题,这行是不正确的:

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 == 0fscanf() 之后返回)。

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 **,如图所示。如果扫描失败,则没有可释放的内容。

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 2018-09-24
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2015-08-27
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多