以示例为例
int i=10,j;
float b=3.14,c;
char str[30];
sprintf(str,"%d%f",i,b);
sscanf(str,"%d%f",&j,&c);
printf("%d ----- %f\n",j,c);
输出: - 103 ----- 0.1400000
如您所见,最初是i=10
和b=3.14
。
我希望j=10
和c=3.14
使用sprint()
和sscanf()
。
我面临的问题是编译器会分配j=103
和c=0.140000
。
有没有办法摆脱sscanf()
中的这个问题?
答案 0 :(得分:1)
最好的方法是使用不同的符号分隔数字,但如果你知道第一个int是2个字符长,你可以指定它:
sscanf(str,"%2d%f",&j,&c);
// ^^
答案 1 :(得分:1)
向sprintf
添加一个空格。变化:
sprintf(str,"%d%f",i,b)
到
sprintf(str,"%d %f",i,b)
除此之外:在这里使用snprintf
也更安全:
snprintf(str, sizeof str, "%d %f", i, b)
答案 2 :(得分:1)
你错过了一个空格
更改
sprintf(str,"%d%f",i,b);
到
sprintf(str,"%d %f",i,b);
#include <stdio.h>
int main()
{
int i=10,j;
float b=3.14,c;
char str[30];
sprintf(str,"%d %f",i,b);
sscanf(str,"%d%f",&j,&c);
printf("%d ----- %f\n",j,c);
return 0;
}
输出
~ > ./a.out
10 ----- 3.140000
答案 3 :(得分:0)
%d
中的sscanf
转换说明符将匹配str
指向的缓冲区中的任意数量的连续数字字符,直到遇到无法匹配的非数字字符为止。这将导致浮点的整数部分被读取为int值的一部分。因此,您必须有一种方法可以将整数结束的位置与字符串str
中的float start分开。您可以将任何非数字字符作为标记来从浮点值中分隔int值。
int i = 10, j;
float b = 3.14, c;
char str[30];
// a # to separate the two values, can be any non-numeric char so that it
// is not mistaken for a digit in the int or float value
sprintf(str,"%d#%f", i, b);
// match the separator character to read int and then float
sscanf(str, "%d#%f", &j, &c);