【问题标题】:Exc_bad_access Error in fscanffscanf 中的 Exc_bad_access 错误
【发布时间】:2013-11-10 07:01:24
【问题描述】:

我在 iOS 项目的 Xcode 设置中运行以下代码,并在第一次迭代本身即 j = 0 的第二个 fscanf 命令即 fscanf(fid, "%d", &fIndex); 上获取 EXC_BAD_ACCESS(代码 = 2,地址 0x30);

char word[wordLength]; // wordlength is set to 4
int numFiles = 0;
int fIndex = 0;
// create the word-fileIndex mapping
for(long i = 0; i < numWords; i++)
{
    fscanf(fid, "%s%d", word, &numFiles);
    vector<int> indexList(numFiles,0);
    for(int j = 0; j < numFiles; j++)
    {
        fscanf(fid, "%d", &fIndex);
        indexList[j] = fIndex;
    }
    wordIndexMap[word] = indexList;
}

但是,只是为了测试,我在第一个fscanf 中添加了另一个要扫描的值,如下所示:

fscanf(fid, "%s%d%d", word, &numFiles, &fIndex);

它运行良好并从文件中读取了正确的值。

有人能告诉我这里发生了什么吗?

我的输入文件是这样的:

abcd num_Index index1 index2 ....

例如

1234 2 14 15
1235 3 5 2 6
1111 1 1

【问题讨论】:

  • 这看起来像 C++,因此它不是 Objective-C C。
  • fscanf 是 C 库的一部分,我添加了 Objective-C 以防万一这种特定于语言 + Xcode 组合的东西

标签: c++ objective-c c xcode5


【解决方案1】:

我认为您应该将 wordLength 设置为 4 以上,因为您需要包含尾随 '\0'。在任何情况下,您在读取这样的输入时都需要小心,并限制您正在阅读的字符数。

【讨论】:

  • 同意;应该使用%4s。不确定这是导致 OPs 问题的原因。
  • 正如我在问题中提到的,错误不是在读取 wordlength=4 的第一个单词时,第一个 fscanf 工作正确,第二个正在读取索引列表是给出错误
  • @Ani 您没有意识到“在存储序列的末尾自动添加终止空字符”对您的代码意味着什么。请参阅 fscanf() 联机帮助页。无论如何停止使用这些垃圾,只需使用&lt;&lt; 来读取您的字符串和数字。
  • 我很久以前学到的一点是,如果我在寻找另一个错误时发现了一个错误,我应该先修复它:) 在这种情况下......它可能是相关的,因为你正在溢出词变量。无论如何,我找不到其他任何问题。对不起。
  • 我知道\0,但因为这个词读得很好......我不认为这是一个问题。使用%4s 并没有帮助,但将字长增加到 10 就可以了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2012-10-03
  • 1970-01-01
  • 2012-02-26
  • 2012-04-23
相关资源
最近更新 更多