请教一个c++中与String相关的问题
vincentcai2013/09/07软件综合 IP:北京
写了一个程序,每当运行到第三次getstr()这个函数时总会报错(崩溃),具体位置是str2=“000”;这一句。请问这是为什么?以及我应该如何解决?
编译器vs2012
源代码下面发上来


attachment icon main.rar 0.83KB RAR 21次下载
来自:计算机科学 / 软件综合
13
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
vincentcai 作者
11年5个月前 IP:未同步
566130
不对。。又看了一下,错误是在    data1.open("data",ios::app);
这一句产生的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vincentcai作者
11年5个月前 IP:未同步
566132
问题更新了,第七次调用data1.open("data",ios::app);的时候会报错:0x5D77341A (msvcp110d.dll) (pic.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0xFFFFFFFF 时发生访问冲突。



attachment icon main.rar 0.83KB RAR 25次下载
咋办啊QAQ
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金星凌日
11年5个月前 IP:未同步
566133
你这程序写的啊……g++直接报错了。加上#include<cstdlib>还是通不过编译。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vcasm
11年5个月前 IP:未同步
566162
授鱼不如送渔,首先不提具体的问题,这个代码问题很多,需要以下几点提升:

1、提高代码效率
     可以通过多阅读优秀的源码,学习编程技巧,举个例子,getstr的33行代码量实际上一句sprintf函数即可更高效的实现,getstr看似更细节的实现了功能,实际上使用了标准模块库,编译产生的代码长度更加远远大于只有sprintf的静态代码量,process1函数也需要优化。。。。
    看似代码冗余仅仅影响效率,实际上很多bug都是不强壮的冗余代码中产生。

2、改善编程习惯
     只是一份代码,也许以偏概全了
    入口安全缺乏检查,代码是否运行在正常的环境中呢?比如这份代码文件如果没有正常打开,仅仅做了提示,文件打开失败却依然执行文件操作,另外子函数参数检查也没有。。。。

3、提升代码测试、检查的手段
    很多程序崩溃并不止体现在执行到bug代码的那一刻,这个例子就是典型的体现,其实问题很简单,楼主多看看多想想
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vincentcai作者
11年5个月前 IP:未同步
566180
回 4楼(vcasm) 的帖子
1、我编程语言学的很不好。平时从不在计算机上写程序,这次写这个的原因是要处理一堆文件。
然后,请问从哪里能了解更多的头文件中提供的函数呢?我原来从来没听说过sprintf这个函数。。。。
2、这个程序的目的就是处理一堆名称连续的文件。所以文件打开失败输出error这条语句相当于调试语句,我只需要知道打开成功没有。调试好后文件是一定能正常打开的。还有,请问什么是子函数参数检查?
3、按照您说的我重写了部分代码。崩溃依旧=- =

attachment icon main.rar 1.01KB RAR 28次下载
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金星凌日
11年5个月前 IP:未同步
566181
回 5楼(vincentcai) 的帖子
想了解C++的标准库,可以去这里:XXXXXXXXXXXXXXXXXXXXXXXX/
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vincentcai作者
11年5个月前 IP:未同步
566182
回 6楼(金星凌日) 的帖子
谢谢。。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金星凌日
11年5个月前 IP:未同步
566183
    file.open(filename,ios::in|ios::binary);
    if(!XXXXXXX_open())
        cout<<"error1 "<<endl;

        XXXXXXXad(pic,16694);
        XXXXXXXose();
在这一段代码中,即使文件没有被正确打开,XXXXXXXad仍会运行。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vincentcai作者
11年5个月前 IP:未同步
566184
回 4楼(vcasm) 的帖子
请问文件关闭后是还需其他操作么?问题与关闭文件有关否?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vincentcai作者
11年5个月前 IP:未同步
566186
回 8楼(金星凌日) 的帖子
我明白,但这应该不是造成崩溃的原因吧。这个程序运行的时候文件肯定会被正确打开的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vcasm
11年5个月前 IP:未同步
566190
回 5楼(vincentcai) 的帖子
说具体点吧:

首先定义  char strFileName[_MAX_PATH]={0};
请用
sprintf(strFileName,"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXv%XXXXXXp",count);
替换整个getstr函数,getstr函数写的问题很多,排除bug没意义直接替换吧

其次检查process1函数里面data、p数组的赋值定义,这个结果数组不知道存在的意义,唯一产生结果运算是data[p[0]]=data[p[0]]|temp;其中data和p都没有赋值,不清楚作者是否默认编译器初始的数组空间全部都是置零的状态?如果这样为什么main函数里面批量处理文件?


实在有些不理解下面这样的写法
p[1]=p[1]+1;
if(p[1]==8)
{
    p[1]=0;
    p[0]=p[0]+1;
}
p[1]的意义在哪?  直接在数据指针寻址时X/8就是了,



还有,无论能不能100%保证程序都是按自己想法正确运行,所有条件判断的正确处理流程需要保证,这是正确的编程风格,这点不能保证以后会逼着你交很多学费的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
vincentcai作者
11年5个月前 IP:未同步
566197
回 11楼(vcasm) 的帖子
谢谢您。我对很多编程上的标准都不是很了解。也不知道应该怎么去做。所以写出来的东西问题一堆。。。呵呵呵
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
vincentcai
进士 笔友
文章
33
回复
219
学术分
0
2010/07/16注册,6年11个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}