C动态数据说明符

时间:2016-01-02 12:41:16

标签: c arrays integer scanf

我想写下面的代码,但我失败了。 我想将数组y的动态数量的字符分配给x。这个数字将在稍后定义。这是我的意思的一个简单例子。

#include<stdio.h>
int main() 
{
    int x=0;
    char y[]={'5','4'};
    int z=1;
    sscanf(y,"%zi",&x);       
    printf("%i",x);         //Each time value of x=0
    sscanf(y,"%1i",&x);    //I want to make this 1 dynamic "int z"
    printf("%i",x);       //Here x value =54.
    return 0;
}

2 个答案:

答案 0 :(得分:3)

简洁地说,你不能直接做你想做的事。

使用printf(),您可以使用此项,其中所有三个变量的类型为int,宽度将从xy中读取:

printf("%*.*d", x, y, z);

但是,scanf()系列函数没有任何类似之处。 *表示scanf()中的“分配抑制”。请注意,在C99及更高版本中,%zi告诉scanf()指针参数的类型为size_t *。这可能解释了为什么你得到0的结果; sscanf()写出了传递给它的变量的界限。

最好的办法是使用snprintf()创建scanf()要使用的格式字符串。

int x;
char y[] = { '5', '4' };
int z = 1;
char format[16];
snprintf(format, sizeof(format), "%%%di", z);
if (sscanf(y, format, &x) != 1)
    …handle error…
printf("%d\n", x);    // Will print 5

请注意,如果z为1或2,则此工作正常;如果z较大,则y不是以空字符结尾的字符串,并且您遇到未定义的行为。如果z为零或为负,您也会遇到问题。

答案 1 :(得分:1)

如果你看到,你声明并初始化了这样的数组 -

 char y[]={'5','4'};

y不是字符串,因为它没有使用'\0'终止,因此您需要显式添加nul终结符。由于sscanf将使用c风格的字符串作为第一个参数。

 char y[]={'5','4','\0'};   // or char y[]="54";

Working demo