c - sscanf 指针与变量地址

标签 c pointers scanf

以下代码有效。

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

为什么?!

最佳答案

问题改变了!

你的第一个代码应该会失败;您需要传递 &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

我认为没有指针变量的版本更明智。

注意测试以确保转换有效!

关于c - sscanf 指针与变量地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15871134/

相关文章:

c - 重新分配指针的指针的指针

java - 如果我有 2 个引用类型,具有相同的值,是否意味着内存中只有 1 个对象

c、指针和 printf 的参数列表。使困惑

c - 使用 strcmp 的段错误

c - 在 C 中访问本地定义的结构

c - feof 检测错误的文件结尾

c - C语言从文件中读取字符

c - 读取结构内部的字符时有什么问题吗?

c++ - 结构成员数组的深拷贝

c - 我们什么时候将 * 添加到指针?