在这个程序中,我尝试从文件中读取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
任何帮助都将不胜感激。
答案 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 **
,如图所示。如果扫描失败,则无需释放。