c - sscanf 替换以前的值

标签 c arrays multidimensional-array scanf

预先感谢您的帮助。我在使用 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 值。

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

感谢您的帮助。

最佳答案

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] .

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

关于c - sscanf 替换以前的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21680632/

相关文章:

c - 在 mkfifo 中授予 super 用户进程的权限

cgo 使用 c struct 数组并在 go 中赋值

ios - 如何存储字符串和相应的标签?

c++ - 这是shell排序还是插入排序?

c - 如何处理二进制文件格式的可移植性问题

c - 如何在没有 C 操作系统的情况下通过串口发送数据?

java - 如何在java中获取数组中的第一个和最后一个元素?

c++ - 允许通过不同维度进行迭代的二维 map 类数据结构

从主函数调用时 C 函数返回不同的值

javascript - JS : convert array objects to dot string