【问题标题】:sscanf replacing previous valuessscanf 替换以前的值
【发布时间】:2014-03-07 23:40:31
【问题描述】:

提前感谢您的帮助。我在使用 sscanf 扫描 txt 中的某些值时遇到问题,在这里找不到类似的内容。这就是我正在阅读的 txt 的样子:

1 NAME 211.505 42.63
2 NAME 335.475 42.63
3 NAME 449.645 42.63
4 NAME 512.435 42.63

这是导致问题的部分:

double contacts[N-1][1];
i = 0;

while(fgets(cLine,100,inFile) != NULL) {
    sscanf(cLine,"%d %s %lf %lf",
        &cNum[i],
        cVarName[i],
        &contacts[i][0],
        &contacts[i][1]);
    i++;
}

每一步都运行良好,但似乎在 i 处,sscanf 替换了 i-1 值。

这可能是我没有注意到的愚蠢的事情,如果是这样的话,对不起。

感谢您的帮助。

【问题讨论】:

  • i是如何初始化的?这些变量的类型是什么?当文件有更多行时,如何防止代码索引数组的末尾?为什么cVarName 也没有被i 索引?
  • 我初始化为 0,只有联系人数组很重要,我通过自己设置 txt 文件并确切知道行数来防止这种情况(但我还添加了一个 if 和 break 在某一点,即不是问题)。
  • 您知道 C 和 C++ 中的数组是从 0..n-1 开始索引的,而不是 1..n,对吧?第 1 行将进入数组 [0]。如果 sscanf “替换 i-1 值”并且它被初始化为 0,你是说第一行被读入 -1 索引??
  • 我愿意,谢谢您的回答。关键是在第 i 步,它加载第 i 个值,但也更改了 i-1 先前定义的 values.d。我删除了我用来保存数组的 fprintfs,这让我可以推断出来。
  • 第 1 行进入 array[0],同时 array[-1] 得到 0。第 2 行进入 array[1],同时 array[2][0]进入array[1][1]等。(按这个顺序,不知道为什么)。

标签: c arrays multidimensional-array scanf


【解决方案1】:

应该声明contacts 数组:

double contacts[N][2];

因为您将其索引为contacts[i][1];它必须在第二维中至少有 2 个条目。数组声明指定每个维度中所需的条目数,而不是最高元素的索引。我只是猜测您希望在第一维中添加 N 条目,因为声明 N-1 似乎很奇怪,但正如我之前指出的,您在循环中没有界限,所以很难说。

C 不执行数组边界检查,因此通过将数组声明为在第二维中只有 1 个元素,您会发现:

&contacts[i][1] == &contacts[i+1][0]

因此,对于第一次之后的每次迭代,每次存储到 contacts[i][0] 时,都会覆盖 contacts[i-1][1]。最后一次迭代会将contacts[i][1] 存储在contacts[i+1][0] 中。

尝试打印元素的地址,看看发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2019-11-24
    • 2016-01-20
    • 2021-11-27
    • 2019-02-03
    相关资源
    最近更新 更多