如何使用sscanf从字符串(从文件读取)直接输入整数值?
我正在尝试编写一段代码来读取PPM文件的“头”。 例如: P3如何使用sscanf从字符串(从文件读取)直接输入整数值?,c,io,scanf,C,Io,Scanf,我正在尝试编写一段代码来读取PPM文件的“头”。 例如: P3 400 200 255 在这种情况下,宽度为400,高度为200,最大颜色值为255。我试图将这些字符串值赋值为整数,但我认为有一种更好的方法可以减少行数,更加“安全”。如何避免使用atoi()函数?(注意,我已经在实际代码中包含了“检查文件是否可打开”部分,这只是一个简化的代码片段) 我建议您使用fscanf而不是sscanf void fscanf_Error(char *file) { fprintf(stderr,"
400 200
255
在这种情况下,宽度为400,高度为200,最大颜色值为255。我试图将这些字符串值赋值为整数,但我认为有一种更好的方法可以减少行数,更加“安全”。如何避免使用atoi()函数?(注意,我已经在实际代码中包含了“检查文件是否可打开”部分,这只是一个简化的代码片段)
我建议您使用fscanf而不是sscanf
void fscanf_Error(char *file)
{
fprintf(stderr,"Error reading file: %s\n. Exiting(1).\n ",file);
exit(1);
}
然后
对于宽度x高度,为什么不直接使用
sscanf
格式字符串扫描整数:sscanf(缓冲区,“%d%d”、&actWidth、&actHeight);
(当然,假设它们以前声明为int
)?阅读actmaxcolor
@lower时也是如此:这是一个好问题,尤其是转换函数具有属性。如果用于转换的代码先扫描到字符串,然后再扫描到整数,可以避免sscanf()
(或scanf()
)中未定义的行为当值对于整数类型来说太大时。我怀疑这里的想法是否那么微妙,但是-这更可能是一个简单的疏忽。“用更少的行和更“安全”的方式来做这件事的更好方法。”。这取决于:1)当输入不是有效的int
时,您希望发生什么?当输入超出范围时,您希望发生什么情况?在fscanf格式字符串中,您很少需要空格,也从不需要换行符。此外,如果没有发生转换且未达到EOF,则fscanf仅返回0。因此,虽然0应该是一个错误,但一些非零返回值也应该是错误。我只添加了这一新行,因为根据您使用的C编译器的版本,会出现警告,抱怨没有使用fscanf的返回。
void fscanf_Error(char *file)
{
fprintf(stderr,"Error reading file: %s\n. Exiting(1).\n ",file);
exit(1);
}
char dummy[12];
if(!fscanf(file, "%s\n", dummy))
fscanf_Error(file);
if(!fscanf(file," %d %d\n", width, height))
fscanf_Error(file);
if(!fscanf(file, "%d\n", maxColour))
fscanf_Error(file);