关于写入异常的问题解决办法

Garysun先生 2017-11-11 02:24:06
char* chess::copy(char* strDest, const char* strSrc)//修改过的字符串复制函数,会忽略末端的\0
{
char* strDestCopy = strDest; //strDest有错误
while (*strSrc != '\0')
{
*strDest++ = *strSrc++;
}
return strDestCopy;
}

void chess::write(char* c){
copy(buffer[wl] + wp, c);
wp += strlen(c);
}

void chess::in(){ //缓冲器中另起一行,但是wp列数初始为0
wl += 1;
wp = 0;
}

执行文件后提示我strDest加载字符串错误,貌似是空指针赋值问题,但我不知道怎么解决,求大神帮助
...全文
224 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-11-13
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
开心秋水 2017-11-12
  • 打赏
  • 举报
回复
建议使用std::string来代替繁琐而且极其容易出错的 char[ ] 和 char*
Garysun先生 2017-11-12
  • 打赏
  • 举报
回复
引用 7 楼 baidu_37097818 的回复:
建议使用std::string来代替繁琐而且极其容易出错的 char[ ] 和 char*
用string确实可以优化数组带来的问题,但是无法用string实现棋盘的复现。。所以可能还是得用数组形式来显示棋盘。。
Garysun先生 2017-11-11
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
建议 传入 strDest 的长度, 避免越界

char* copy(char* strDest, const int iDstNums, const char* strSrc)
{  
  int iLen = min((int)strlen(strSrc), iDstNums - 1);
  memcpy(strDest, strSrc, iLen);
  strDest[iLen] = '\0';

  return strDest;
}
您跟我说的代码中可以将 strDest[iLen] = '\0'; 去掉,不然棋盘中间后一半会发现没有横线了,我将这部分注释以后发现棋盘恢复了,好像是您在最后加入了一个换行符,强制结束了strSrc的输入,因为在后面定义中会用空格来补全未输入的部分。不过还是很谢谢您了!大神!
Garysun先生 2017-11-11
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
建议 传入 strDest 的长度, 避免越界

char* copy(char* strDest, const int iDstNums, const char* strSrc)
{  
  int iLen = min((int)strlen(strSrc), iDstNums - 1);
  memcpy(strDest, strSrc, iLen);
  strDest[iLen] = '\0';

  return strDest;
}
我解决了刚才的外部问题,但是发现您给的代码输进去还是无法正常运行,仍有异常出现
Garysun先生 2017-11-11
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
建议 传入 strDest 的长度, 避免越界

char* copy(char* strDest, const int iDstNums, const char* strSrc)
{  
  int iLen = min((int)strlen(strSrc), iDstNums - 1);
  memcpy(strDest, strSrc, iLen);
  strDest[iLen] = '\0';

  return strDest;
}
您给的形参不是有三个么,然后我在下面引用copy函数地方加入了第三个参数,它提示我加入参数过多; 然后我没加参数,它提示以下两个错误。。。 错误 1 error LNK2019: 无法解析的外部符号 "public: char * __thiscall chess::copy(char *,char const *)" (?copy@chess@@QAEPADPADPBD@Z),该符号在函数 "public: void __thiscall chess::display(void)" (?display@chess@@QAEXXZ) 中被引用 E:\VS2013\projects\自绘五子棋\自绘五子棋\chess.obj 自绘五子棋 错误 2 error LNK1120: 1 个无法解析的外部命令 E:\VS2013\projects\自绘五子棋\Debug\自绘五子棋.exe 自绘五子棋 我直接蒙蔽了#24#24
zgl7903 2017-11-11
  • 打赏
  • 举报
回复
建议 传入 strDest 的长度, 避免越界

char* copy(char* strDest, const int iDstNums, const char* strSrc)
{  
  int iLen = min((int)strlen(strSrc), iDstNums - 1);
  memcpy(strDest, strSrc, iLen);
  strDest[iLen] = '\0';

  return strDest;
}
Garysun先生 2017-11-11
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
在 return strDestCopy; 上边加一句 *strDest =0;试试
还是老样子,而且棋盘还出现了问题。。
starytx 2017-11-11
  • 打赏
  • 举报
回复
在 return strDestCopy; 上边加一句 *strDest =0;试试

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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