我想写下面的代码,但我失败了。 我想将数组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;
}
答案 0 :(得分:3)
简洁地说,你不能直接做你想做的事。
使用printf()
,您可以使用此项,其中所有三个变量的类型为int
,宽度将从x
和y
中读取:
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";