vc++6.0的scanf问题

c/c++ 专栏收录该内容
5 篇文章 0 订阅
今天用vc++做文件的写入和读取练习时,程序为
struct stu
{
	char name[15];
	char num[6];
	float score[2];
}student;

int main(void)
{
	FILE* fp;
	int i;
	if(NULL == (fp = fopen("./1.txt", "wb")))
	{
		printf("File 1.txt cannot be openned!\n");
		return 0;
	}
	printf("plese input:\nname\nnum\nscore\nscore\n");
	for(i=0; i<3; i++)
	{
		scanf("%s %s %f %f", student.name, student.num, &student.score[0], &student.score[1]);

		fwrite(&student, sizeof(student), 1, fp);
	}
	fclose(fp);

	return 0;
}
然后编译没有任何错误,但是运行时候只输入一个数据结构就出现Debug Error, runtime error。
断点调试发现到scanf就出现错误,怎么改也不好,但是在vs2010中就没有错误正确运行,于是各种查资料发现有两种改法
1、把float改成double
2、在scanf之前给float类型的变量赋初值
官方解释
C Run-Time Error R6002
floating-point support not loaded
The necessary floating-point library was not linked.

Possible causes
The program was compiled or linked with an option, such as /FPi87, that requires a coprocessor, but the program was run on a machine that did not have a coprocessor installed. 
A format string for a printf or scanf function contained a floating-point format specification and the program did not contain any floating-point values or variables. 
The compiler minimizes a program's size by loading floating-point support only when necessary. The compiler cannot detect floating-point format specifications in format strings, so it does not load the necessary floating-point routines. 
Use a floating-point argument to correspond to the floating-point format specification, or perform a floating-point assignment elsewhere in the program. This causes floating-point support to be loaded. 
In a mixed-language program, a C library was specified before a FORTRAN library when the program was linked. Relink and specify the C library last.


参考资料:
#include <stdio.h>     
int main()  
{  
    float f1;  
    scanf("%f", &f1);  
    return 0;  
}  
  请有VC++6.0的朋友试一下这个程序,运行的时候输入一个数字,会出现runtime error(运行期错误),VS2008没有错误,其它的版本没有试。

查了一下资料微软给出的官方解释是:当应用程序从控制台读取的浮点值,到一个未初始化"浮动"类型的全局变量使用 scanf() 函数时,则会发生 R6002 浮点格式支持不加载"错误。 在使用任何格式输入的例程中读取值时,也会发生此错误。

微软的官方解决方案:要变通解决此问题,初始化浮点变量或表达式中包含 scanf() 调用该例程中使用该变量。

看来变量的初始化确实是个很好的习惯,我们可以这样改:

#include <stdio.h>    
int main()  
{  
    float f1 = 0;  
    scanf("%f", &f1);  
    return 0;  
}  
或者,在需要用到浮点数的程序的主函数中定义一个:

float staticTempFloat = 0;  

虽然这种方法不太正宗,呵呵,但是,自我认为也不错!

(二)

代码提示runtime error,结果跟踪一下发现错误就出在scanf("%f",&f1);,跟踪一下发现提示 C Run-Time Error R6002 
 floating-point support not loaded 

这条错误信息的含义是没有链接浮点库。
一般出现这条错误信息是因为在调用scanf、printf之前没有使用过浮点运算,
解决的办法也很简单,随便给浮点数赋个值就行了。
#include <stdio.h>     
int main()  
{  
    float f1;  
    f1=0;
    scanf("%f",&f1);  
    return 0;  
}  

阅读(1798
  • 2
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值