【问题标题】:c segmentation fault fgetsc 分段错误 fgets
【发布时间】:2013-01-19 23:08:12
【问题描述】:
int main( int argc, char** argv) {

        FILE *inFilePtr = fopen(*(argv + 1), "r");
        char *rawdata = malloc(sizeof(char) * 100);
        float *ary = malloc(sizeof(float) * 50);
        int counter = 0;
        float averageAns;
        int count = 0;


        while (count < 1 ){
            //fgets(rawdata, 50, inFilePtr); //I have tried both
            fscanf(inFilePtr, "%s", rawdata);
            *(ary + counter) = atof(strtok(rawdata, ","));
             counter++;
            *(ary + counter ) = atof(strtok(rawdata, NULL));
            counter++;
            *(ary + counter) = atof(strtok(rawdata, NULL));
             counter++;
            count++;
        }

我终其一生都无法弄清楚为什么我总是遇到段错误。即使没有循环,它也会出现段错误(计数

它不适用于 fgets()、fscanf()。当我将 fgets 中的流更改为(stdin)时,它会出现段错误,我提到这一点是因为我认为文件 * 是问题,但现在我认为不是。我在数据文件“”和“,”中设置了分隔符。

如果有人知道我做错了什么,我将不胜感激。

【问题讨论】:

  • 您可以使用 valgrind、gdb 或其他几种调试工具来帮助您...您尝试过其中任何一种吗?
  • 还有,为什么不只是ary[counter++] = atof(strtok(rawdata, NULL));
  • 是的,我不是使用 gdb 的专家。它给了我一个没有帮助的错误代码。
  • 你检查过 inFilePtr 不是 NULL 吗?
  • 它不为空,我有一个 printf 语句打印 argv[1] 的值,它正在打印我期望的文件名,这也是无关紧要的,因为它不适用于标准输入要么。

标签: c segmentation-fault fgets


【解决方案1】:

您对fscanf 的调用肯定会失败,因为您没有提供输出参数。它应该看起来像:

fscanf(inFilePtr, "%s", rawdata);

您对strtok 的调用也无效。要继续标记相同的字符串,strtokfirst 参数应该是 NULLstrtok 期望第二个参数仍然是有效字符串。

这些问题中的每一个都会自行导致段错误。为了简化您将来的调试,我建议您使用调试器并在您正在调试的语句之后设置断点,或者注释掉您可能希望出现段错误的其他行(如果您的代码通常包括对字符串执行任何操作的任何内容)处于脆弱状态。

另外,就风格而言,

*(ary + counter)

正常写

ary[counter]

【讨论】:

  • 我有一个输出参数,但 strtok 可能是问题所在。谢谢,我试试
  • 啊,没看到编辑。鉴于它不适用于(有效的)fgets 调用,它可能是 strtok
【解决方案2】:

尝试使用 (char *) 强制转换您的 malloc 调用

也许,只是也许:ary[counter++] = atof(strtok(rawdata, ","));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多