sscanf使用c浮动

sscanf使用c浮动,c,floating-point,floating-point-conversion,C,Floating Point,Floating Point Conversion,所以我有一个有多个字符串的文件。我应该使用fgets来读取每一行,然后使用sscanf来分解字符串并将它们处理到我的结构中。这里有一个例子 38L Lee, Victor; 2.8 第一个是id,第二个是name,最后是gpa。当我尝试使用sscanf读取gpa时,它的读数是0.0,而不是2.8。这是我的密码 bool getstu (FILE* fpstu, STU* pstu) { // Local Definitions int ioResult; char temp

所以我有一个有多个字符串的文件。我应该使用
fgets
来读取每一行,然后使用
sscanf
来分解字符串并将它们处理到我的结构中。这里有一个例子

38L Lee, Victor; 2.8
第一个是id,第二个是name,最后是gpa。当我尝试使用sscanf读取gpa时,它的读数是0.0,而不是2.8。这是我的密码

bool getstu (FILE* fpstu, STU* pstu)
{

//  Local Definitions
    int ioResult;
    char temp[100];
    char *ptr;
    char tempStr[50];

//  Statements
    fgets(temp, sizeof(temp), fpstu);
    {
        ptr = temp;
        sscanf(ptr, "%3s", pstu->id);
        ptr += strlen(pstu->id) + 1;
        sscanf(ptr, "%[^;]", tempStr);

        pstu->name = aloName(tempStr);

        ptr += strlen(tempStr) + 2;
        sscanf(ptr, "%s", tempStr);
        sscanf(tempStr, "%3.1f", pstu->gpa);
    }

return ioResult == 1;
}// getstu
有人能向我解释一下我做错了什么,以及我如何解决这个问题吗

sscanf(tempStr, "%3.1f", pstu->gpa);
应该是

sscanf(tempStr, "%3.1f", &(pstu->gpa));

,我想。

您是否尝试添加
printf(“tempStr是“%s”\n”,tempStr)检查您试图转换的内容?什么类型的
pstu->gpa
<代码>%f
转换一个
浮点数
,而不是
双精度
3.1
没有用,最好删除。切勿使用
get
。改用
fgets
,因为它接受一个大小参数,可以避免缓冲区溢出。@TonyD:是的,我试过打印
tempStr
,它正在打印
2.8
pstu->gpa
是float类型。@JohnZwinck:谢谢你指出这一点。那是个打字错误。我确实在我的程序中使用了
fgets
。将修复打字错误。我在我的机器上确认-不使用
3.1
,获得0。我认为问题在于,虽然宽度规格(您的“3”)在
scanf
格式中有效,但精度规格不是。。。这仅对输出ala
printf
有意义或允许。对于输入,无论输入的精度如何,无论读入的类型是否能够精确地存储它。请参阅手册-+1 Oooh。。。我只是在我的程序中记下了地址,没有想到-你是对的-程序中缺少了地址。3.1不起作用-需要是
%f
%3f
。啊,好吧,我知道哪里出了问题。谢谢你指出这一点。非常感谢。