Debug Assertion Failed!请大家帮忙解决。

机器猫2014 2014-05-14 09:58:50
我运行程序,代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *fp;
char str[100];
int i;
if((fp=fopen("f:\\test.dat","w"))==NULL)
{
printf("can not open the file.\n");
exit(0);
}
else
{
printf("input a string:");
gets(str);// scanf("%s",str);//
for(i=0;str[i]!='\0'&&i<100;i++)
{
if(str[i]>='a'&&str[i]<='z')
str[i]=str[i]-32;
fputc(str[i],fp);
}
fclose(fp);
fp=fopen("test","r");
fgets(str,100,fp);
printf("%s\n",str);
fclose(fp);
}
return 0;
}


结果出错,错误如下,

怎么都没办法解决,求各位帮忙。
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器猫2014 2014-05-15
  • 打赏
  • 举报
回复
问题已经解决了,是因为我定义 的文件夹为test.dat,在程序前半部分:
if((fp=fopen("f:\\test.dat","w"))==NULL)
但是在程序后面却只写了
fp=fopen("test","r");
把这一句改为
fp=fopen("test.dat","r");
就ok了。
zybjtu 2014-05-14
  • 打赏
  • 举报
回复
看看fp是否为null。 我猜你目录下没有test这个文件。
机器猫2014 2014-05-14
  • 打赏
  • 举报
回复
引用 8 楼 Saleayas 的回复:
fp=fopen("test","r");
_assert(fp);
if(!fp)
{
ERROR....
}
什么意思呢?弄不明白,求指教。
Saleayas 2014-05-14
  • 打赏
  • 举报
回复
fp=fopen("test","r");
_assert(fp);
if(!fp)
{
ERROR....
}
Saleayas 2014-05-14
  • 打赏
  • 举报
回复
_TSCHAR * __cdecl _fgetts (
        _TSCHAR *string,
        int count,
        FILE *str
        )
{
    FILE *stream;
    _TSCHAR *pointer = string;
    _TSCHAR *retval = string;
    int ch;

    _VALIDATE_RETURN(( string != NULL ) || ( count == 0 ), EINVAL, NULL);
    _VALIDATE_RETURN(( count >= 0 ), EINVAL, NULL);
    _VALIDATE_RETURN(( str != NULL ), EINVAL, NULL);
你的 fp 是没有打开,为 NULL。
机器猫2014 2014-05-14
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
不是很懂啊,请求实际操作指教。能不能帮我修改调试?
机器猫2014 2014-05-14
  • 打赏
  • 举报
回复
引用 3 楼 Symfund 的回复:

fp=fopen("test","r");
memset(str, 100, '\0'); // 加上这句试试看!
fgets(str,100,fp);
printf("%s\n",str);
fclose(fp);
你的意思是清零啊,但是没有解决问题,而且清零函数也没写对,应该是menset(str,'\0',100);不过这里不是请不清零的问题呐。
赵4老师 2014-05-14
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
Symfund 2014-05-14
  • 打赏
  • 举报
回复

fp=fopen("test","r");
memset(str, 100, '\0'); // 加上这句试试看!
fgets(str,100,fp);
printf("%s\n",str);
fclose(fp);
机器猫2014 2014-05-14
  • 打赏
  • 举报
回复
引用 1 楼 FightForProgrammer 的回复:
这个可以自己设单步调式撒
设置了单步调式,可是仍然不知道怎么改,错误在这几行:
fp=fopen("test","r");
        fgets(str,100,fp);
        printf("%s\n",str);
        fclose(fp);
求指教。
FightForProgrammer 2014-05-14
  • 打赏
  • 举报
回复
这个可以自己设单步调式撒
关于龙书第13章地形绘制的terrain项目运行出错问题 (注:龙书即:《DirectX9.0 3D游戏开发编程基础》) 在学习该教材时,当我们试着编译并运行13章地形绘制的terrain项目时,发现运行出错,并弹出了一个出错提示窗口,提示我们::访问vector 越界了 提示窗口的内容如下: -------------------------------------------------------------------- Microsoft Visual C++ Debug Library Debug Assertion failed! Program:...cuments and Settings\Administrator\Terrain\Debug\Terrain.exe File: d:\microsoft visual studio 10.0\vc\include\vector Line:932 Expression : vector subscript out of range For information on how your program can cause an assertion Failure , see the Visual C++ documentation on asserts. (Press Retry to debug the application) [终止(A)] [重试(R)] [忽略(I)] ---------------------------------------------------------------------------------- 问题主要出现在terrain.cpp 文件中的几个函数内部传递参数最终作为了vector的索引值,得到的索引值没有经过限定,导致超出了vector的界限-----最终访问越界. 修改的地方在下面这几处: 在terrain.cpp文档里搜索”//修改过!!!” bool Terrain::genTexture(D3DXVECTOR3* directionToLight) float Terrain::computeShade(int cellRow, int cellCol, D3DXVECTOR3* directionToLight) float Terrain::getHeight(float x, float z) 在terrain.cpp文档里搜索”//注意这里!!!” /int Terrain::getHeightmapEntry(int row, int col) bool Terrain::lightTerrain(D3DXVECTOR3* directionToLight) 在terrainDriver.cpp文档里搜索”//注意这里!!!” float height = TheTerrain->getHeight( pos.x, pos.z ); 我的修改主要是通过在传递索引值的地方,限定索引值的范围,这样就避免了vector访问越界,这也是龙书作者在写该13章的代码时一时所忽略掉的. 只修改过terrain.cpp文件中的内容,其他的都没动.所以可以只将terrain.cpp拷贝到工程中替换掉原来的就可以了.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧