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
格式中有效,但精度规格不是。。。这仅对输出alaprintf
有意义或允许。对于输入,无论输入的精度如何,无论读入的类型是否能够精确地存储它。请参阅手册-+1 Oooh。。。我只是在我的程序中记下了地址,没有想到-你是对的-程序中缺少了地址。3.1不起作用-需要是%f
或%3f
。啊,好吧,我知道哪里出了问题。谢谢你指出这一点。非常感谢。