C 数组某些部分中的atoi()输出错误
我正在读取输入文件并将其写入2D整数数组。文件中的所有数字都有两个字符 它工作正常,但在所有[48]-[57]元素中,整数都有一个冗余数字(例如,30871447而不是3、87、44)。strtol()也存在同样的问题。输入文件的十六进制代码在这些部分看起来绝对正常C 数组某些部分中的atoi()输出错误,c,atoi,strtol,C,Atoi,Strtol,我正在读取输入文件并将其写入2D整数数组。文件中的所有数字都有两个字符 它工作正常,但在所有[48]-[57]元素中,整数都有一个冗余数字(例如,30871447而不是3、87、44)。strtol()也存在同样的问题。输入文件的十六进制代码在这些部分看起来绝对正常 for (int a = 0; a < d; a++) { for (int b = 0; b < d; b++) { //read two chars uint16_t
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);
}
}
for(int a=0;a //转换为int并放入数组(它在48中生成错误的int,感谢所有的注释,尤其是那些提到atoi
所需的\0
的注释
使用char str[3]
而不是uint16\u t
可以消除此问题并正确转换所有数字
for (int a = 0; a < d; a++)
{
for (int b = 0; b < d; b++)
{
char str[3];
str[2] = '\0';
fread(&str, 2, 1, inptr);
arr[a][b] = atoi(str);
fseek(inptr, 1, SEEK_CUR);
}
}
for(int a=0;a
您应该提供一个。在这种情况下,您应该创建一个简单的main函数,删除fread
,然后只加载一个不起作用的数字num
。如果找不到这样的数字,那么您可能可以创建一个没有atoi
的函数。此外,sizeof(char)
只是一种编写1
;)此外,您的文件编码是什么?似乎您希望每个数字都用一个字符分隔,但情况可能并非如此,特别是对于您描述的新数据行,由于atoi()
执行越界访问,从而导致您输入的数据在num
的范围内不以null终止。从技术上讲,“未定义”这意味着不需要解释为什么某些输入数据会出现错误行为而其他数据不会出现错误行为,但在实践中,我怀疑修复该问题不会解决观察到的错误行为。atoi
需要空终止符,但您的fread
没有添加空终止符。它只从文件中读取两个字符,这两者都不可能是\0
(也不清楚为什么要在uint16\u t
中键入双关语。为什么不读入字符数组?)&num
不是字符串,atoi
提供零错误检测和零方法来验证转换——因此无法检测原始代码中对atoi
的无效使用。这就是为什么生产代码应始终使用strtol
或strtoul
并完全验证(1)该数字被转换,(2)转换没有设置errno
,如果结果类型小于转换的大小(3),则该值在使用的最终类型的范围内。@DavidC.Rankin都非常正确,但考虑到他使用的是fseek(inptr,1,SEEK\u CUR),这有点毫无意义
盲目跳过可能是空格、可能是换行符或可能意外地是另一个数字的字符……同意,在这种情况下,示例输入将非常有用。尽管使用atoi
与strtol
等将保持不变。