关于sprintf()和scanf()的查询

时间:2014-02-26 19:04:50

标签: c printf scanf

以示例为例

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=10b=3.14

我希望j=10c=3.14使用sprint()sscanf()

我面临的问题是编译器会分配j=103c=0.140000

有没有办法摆脱sscanf()中的这个问题?

4 个答案:

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