第一列打印为(0, 0)
,因为atoi
失败。请不要使用atoi
,而是使用strtol
which 将使您能够检查转换是否成功。
失败的原因atoi
是因为你有一个额外的\n
字符,因为fgets(fgets(line, 2, fp);
你只读取一个字符 - 因为你传递了 2 作为缓冲区大小,并且缓冲区的 1 个元素是为\0
字符保留的。只需使用足够大的缓冲区来读取整行,并在那里传递缓冲区的大小。
为了修复其他错误,请不要使用feof
. 而是检查fgets
返回值以查看它从文件中读取了多少个字符(或者,如果您真的想feof
在调用后进行检查fgets
)。
while ( fgets(line, sizeof(line), fp) > 0)
{
char* end;
alive_row = strtol(&line[0], &end, 10);
// If the end points to the &line[0], then no
// characters were converted!
if(end == &line[0])
{
printf("strtol failed!\n");
return 0;
}
alive_column = strtol(&line[2], &end, 10);
// If the end points to the &line[2], then no
// characters were converted!
if(end == &line[2])
{
printf("strtol failed!\n");
return 0;
}
fprintf(stderr, "\n Cell: (%i)(%i)", alive_row, alive_column);
}
我们有一个检查&line[0] == end
,因为传递给的第二个参数strtol
是
引用 char* 类型的对象,其值由函数设置为 str 中数值之后的下一个字符。
如果字符串中没有数值,此指针将指向您尝试转换的字符串的开头。
如果您不知道位数是 1 还是 2 或任何位数,您仍然可以strtol
在这里帮助您:
while ( fgets(line, sizeof(line), fp) > 0)
{
char* end;
char* tmp;
alive_row = strtol(&line[0], &end, 10);
// If the end points to the &line[0], then no
// characters were converted!
if(end == &line[0])
{
printf("strtol failed!\n");
return 0;
}
// If the previous strtol converted the first number
// end will point to the space character (the first character after the number).
// So, just pass
// end + 1 which should point to the second number
tmp = end + 1;
alive_column = strtol(tmp, &end, 10);
// If the end points to the tmp, then no
// characters were converted!
// (this is why we used this tmp to place end + 1 - we need to
// check for the success of the strtol).
if(end == tmp)
{
printf("strtol failed!\n");
return 0;
}
fprintf(stderr, "\n Cell: (%i)(%i)", alive_row, alive_column);
}