以下代码有效。
unsigned int i1;unsigned int i2;
float *v1;float *v2;
sscanf("1 1 2.0 3.0","%u %u %f",&i1,&i2,v1,v2);
printf("%f",v1);
添加另一个%f,以下内容不起作用。它编译但我得到 bash:[9612:1(255)] tcsetattr:设备的ioctl不合适。
unsigned int i1;unsigned int i2;
float *v1;float *v2;
sscanf("1 1 2.0 3.0","%u %u %f %f",&i1,&i2,v1,v2);
为什么?!
答案 0 :(得分:2)
问题改变了!
你的第一个代码应该失败;你需要传递 &v1
并且传递v2
是没有意义的,因为它是(a)不是地址而且(b)无论如何都没有转换规范。
第一个代码应该失败,因为你没有在v1
中传递初始化的指针,并且传递v2
没有意义,因为它既没有被初始化也没有被格式字符串使用。当您将未初始化的指针传递给sscanf()
时,您调用未定义的行为,并且任何响应都是可接受的 - 灾难性的失败(擦除磁盘?),或者几乎像预期的行为一样良性(即使没有充分理由期待这样的行为)良性行为)。类似的评论适用于大多数功能;不要传递未初始化的指针;这样做很少有好处。
第二个失败是因为你没有传递初始化的地址。
更正代码1:
unsigned int i1;
unsigned int i2;
float f1;
float *v1 = &f1;
if (sscanf("1 1 2.0 3.0", "%u %u %f", &i1, &i2, v1) == 3)
printf("%f\n", *v1);
(已删除未使用的变量v2
。)
备选方案1:
unsigned int i1;
unsigned int i2;
float v1;
if (sscanf("1 1 2.0 3.0", "%u %u %f", &i1, &i2, &v1) == 3)
printf("%f\n", v1);
(没有指针变量。)
更正代码2:
unsigned int i1;
unsigned int i2;
float v1; // Not pointer
float v2; // Not pointer
if (sscanf("1 1 2.0 3.0", "%u %u %f %f", &i1, &i2, &v1, &v2) == 4)
printf("%f %f\n", v1, v2);
或者:
unsigned int i1;
unsigned int i2;
float f1;
float f2;
float *v1 = &v1; // Initialized pointer
float *v2 = &v2; // Initialized pointer
if (sscanf("1 1 2.0 3.0", "%u %u %f %f", &i1, &i2, v1, v2) == 4)
printf("%f %f\n", f1, f2); // Or *v1, *v2
我认为没有指针变量的版本更明智。
请注意测试以确保转换有效!