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
如何使用sscanf从字符串(从文件读取)直接输入整数值?_C_Io_Scanf - Fatal编程技术网

如何使用sscanf从字符串(从文件读取)直接输入整数值?

如何使用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,"

我正在尝试编写一段代码来读取PPM文件的“头”。 例如:

P3
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);