Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组某些部分中的atoi()输出错误_C_Atoi_Strtol - Fatal编程技术网

C 数组某些部分中的atoi()输出错误

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

我正在读取输入文件并将其写入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 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
等将保持不变。