【发布时间】:2019-10-24 21:50:23
【问题描述】:
我正在读取一个输入文件并将其写入一个二维整数数组。文件中的所有数字都有两个字符。
效果很好,但在所有 [48]-[57] 元素中,整数都有一个冗余数字(例如,30、871、447 而不是 3、87、44)。 strtol() 也有同样的问题。输入文件的十六进制代码在这些部分看起来完全正常。
for (int a = 0; a < d; a++)
{
for (int b = 0; b < d; b++)
{
//read two chars
uint16_t num;
fread(&num, sizeof(char) * 2, 1, inptr);
//convert to int and put to the array (it makes wrong int in 48 <= b <= 57)
arr[a][b] = atoi((char*)&num);
//skip space or line break in the input file
fseek(inptr, sizeof(char), SEEK_CUR);
}
}
有什么问题?为什么只有 [48]-[57] 工作不正确?
【问题讨论】:
-
您应该提供minimal reproducible example。在这种情况下,您应该创建一个简单的 main 函数并删除
fread并仅使用无效的数字加载num。如果您找不到这样的号码,那么您可以创建一个不带atoi的minimal reproducible example。 -
此外,
sizeof(char)只是1的一种奇特写作方式;) -
另外,你的文件编码是什么?似乎 l 似乎您希望每个数字都由恰好一个字符分隔,但情况可能并非如此,尤其是对于新行
-
对于您描述的数据,由于
atoi()执行越界访问,您的程序表现出未定义的行为,结果,反过来,您正在输入的数据它没有在num的范围内以空值结尾。从技术上讲,“未定义”意味着无需解释为什么某些输入数据会出现不当行为,而其他数据不会发生不当行为,但在实践中,我怀疑修复该问题不会解决观察到的不当行为。 -
atoi需要空终止符,但您的fread不添加空终止符。它只是从文件中读取两个字符,这两个字符都不可能是\0。 (也不清楚你为什么要输入uint16_t。为什么不读入一个字符数组?)