【问题标题】:I am getting a segmentation fault我遇到了分段错误
【发布时间】:2019-09-25 03:34:07
【问题描述】:

由于某种原因,我遇到了分段错误,我编写了这个程序来计算两个日期之间的天数,并希望将“dd-mm-yyyy”表示为字符串和“dd2-mm2-yyyy2”也应该表示为字符串,我想我可以用这种方式解决它,但是我遇到了分段错误,有人可以帮我吗?我做错了什么?

【问题讨论】:

  • 请在提交问题之前花一些时间格式化您的代码。
  • 你的输入是什么,预期的输出,错误发生在哪里?
  • 使用调试器单步执行程序。
  • 显然您没有费心一步步调试甚至检查您的代码:我们为什么要这样做?
  • atoi(argv[n]) 没有首先检查是否传递了所需数量的参数是获取 seg-faults 的一种非常简单的方法。在首先确保argc > n之前,切勿访问argv[n]

标签: c


【解决方案1】:

这似乎不正确。 argv[1] 是您的“day”字符串,长度为 1 或 2 个字符,您正在索引字符 3 和 4。

char monstr[3];
monstr[0]= argv [1][3];
monstr[1]=argv [1][4];
monstr[2] = '\0';

这应该是:

char monstr[3];
monstr[0]= argv [2][0];
monstr[1]=argv [2][1];
monstr[2] = '\0';

与其他一些字符串相同。

但是,也就是说,我是基于您似乎如何解析输入。如果您希望您的输入为 dd-mm-yyyy,那么您的输入不正确。相反,您应该这样做:

int dd, mm, yyyy;
sscanf(argv[1], "%d-%d-%d", &dd, &mm, &yyyy);

与其他字符串相同。而且这样的话,我之前纠正的事情就不需要纠正了。

作为一般建议:发生分段错误的原因是因为您正在访问您无法访问的内存。一个常见的原因是超出了数组边界,或者使用了无效的指针。在你的情况下,它似乎是这两者之一,它来自滥用 argv。

【讨论】:

  • 这个问题好像已经被date-time conversion回答了
  • 所以会是这样吗? char daystr[3]; daystr[0] =argv[1][0]; daystr[1] = argv[1][1]; daystr[2] = '\0'; dd = atoi(daystr);字符怪物[3];怪物[0]= argv [2][0];怪物[1]=argv [2][1];怪物[2] = '\0'; mm = atoi(怪物);字符年[5]; yearstr[0]= argv [3][0]; yearstr[1]=argv [3][1]; yearstr[2]='\0'; yyyy = atoi(yearstr); char daystr2[3]; daystr2[0] =argv[4][0]; daystr2[1] = argv[4][1]; daystr2[2] = '\0'; dd2= atoi(daystr2);
猜你喜欢
  • 2022-01-25
  • 2019-05-05
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多