运行之后报错了

运行之后报错了

http://img1.sycdn.imooc.com//climg/5ae80d5600013ea612390862.jpg

请问老师为什么我这个编程练习成功编译并且运行之后,会弹窗报错呢?


正在回答

登陆购买课程后可参与讨论,去登陆

7回答

请同学新建一个回答贴出来代码,你写在回复中,又包含注释,不便于帮助调试~

  • MasonM 提问者 #1
    好的谢谢老师,我已新建回答贴了,谢谢老师的提醒!
    2018-05-03 16:52:09
Tender10 2018-05-07 10:17:15
#include <iostream>
#include <assert.h>
#include <string>
using namespace std;
char *str_cat(char *des,const char *src)
{
    
    assert((des != NULL) && (src != NULL));
    
    char *address = des;
    
    while (*des != '\0') des++;
    while ((*des++ = *src++)!= '\0')
        ;
    
    return address;
}

char *str_copy(char *des,const char *src)
{
    assert((des != NULL) && (src != NULL));
    char *address = des;
    
    while ((*des++ = *src++)!= '\0')
        ;
    return address;
    
}

int str_len(const char *a){
    assert(a!=NULL);
    int add = 0;
    while(*a++ != '\0'){
        add++;
    }
    return add;
}

int main(){
    char a[] = {"I am a chinese"};
    char b[] = {"I love china"};
    char ds[20]={"I am a chinese"};
    
    if(str_len(a) >= str_len(b)){
        cout<<str_copy(ds,a)<<endl;
        cout<<str_cat(ds,b)<<endl;
    }else{
        cout<<str_copy(ds,b)<<endl;
        cout<<str_cat(ds,a)<<endl;
    }
    return 0;
}

修改一下你的代码,如上所示,如果还有什么不明白的地方,可以在问答里继续提问。

  • 提问者 MasonM #1
    老师我用vs2017编译这个代码依旧会显示一个DebugError的报错框,但我用dev c++编译就没事,这是为什么呢?
    2018-05-08 12:22:18
  • Tender10 回复 提问者 MasonM #2
    这是因为VS2017版本针对字符串做了一些修改,具体的解决方法,在课程的教辅资料中已经给大家进行了说明咯。可查阅教辅资料《针对VS2017对字符串常量做的修改》,如果还有什么不明白的地方,可以在问答里继续提问,助教都会帮助解决。祝学习愉快~
    2018-05-08 13:48:53
  • 提问者 MasonM 回复 Tender10 #3
    ok好的谢谢老师!
    2018-05-08 22:01:37
guly 2018-05-04 14:41:54

你好,小慕测试你的代码是没有问题的,至于您的弹框报错建议操作如下:

把 project->配置属性->c/c++->代码生成->基本运行时检查 为 默认值 就不会报本异常。

如果解决您的问题请采纳,祝学习愉快!

  • 提问者 MasonM #1
    老师,我按你的操作进行修改后,虽然部报异常,但它会提示Project.exe已停止工作呀?怎么办?
    2018-05-05 21:10:27
提问者 MasonM 2018-05-03 21:19:17

http://img1.sycdn.imooc.com//climg/5aeb0c150001478e09670587.jpg

#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
char *str_copy(char *a, const char *b)
{
 assert((a != NULL) && (b != NULL));
 char *add = a;
 while ((*a++ = *b++) != '\0');
 return add;
}
char *str_cat(char *a, const char *b)
{
 assert((a != NULL) && (b != NULL));
 char *add = a;
 while (*a != '\0')a++;
 *a = ' ';
 a++;
 while ((*a++ = *b++) != '\0');
 return add;

}
int str_len(const char *a)
{
 assert(a != NULL);
 int add = 0;
 while (*a++ != '\0')
 {
  add++;
 }
 return add;
}
int main()
{
 //定义两个字符串
 char a[] = { "I am chinese" };
 char b[] = { "I love china" };
 char ab[30]; 
 //比较两个字符串的长度,根据结果连接字符串,并输出连接后的字符串
 if (str_len(a) >= str_len(b))
 {
  cout << str_copy(ab, a);
  cout << str_cat(a, b);
 }
 else
 {
  cout << str_copy(ab, b);
  cout << str_cat(b, a);
 }
 system("pause");
 return 0;
}

按照这样编码,字符可以正常显示,但会弹窗这样报错,这是为什么呢,请老师解答一下,谢谢老师!

imooc_澈 2018-05-03 17:13:33

你好,你的代码是对的,前面之所以会多输出一个I am chinese是因为你在使用str_copy函数的时候也进行了输出,并且字符串拼接时,中间没有加上空格,如图:

http://img1.sycdn.imooc.com//climg/5aead2130001029303160202.jpg

修改如下:

http://img1.sycdn.imooc.com//climg/5aead2a60001119703850199.jpg

http://img1.sycdn.imooc.com//climg/5aead2ba0001ccba05610276.jpg

祝学习愉快~

  • 提问者 MasonM #1
    老师,不知道为什么程序运行之后会出现弹窗,显示一个DebugError的报错框,这是为什么呢?
    2018-05-03 21:16:22
提问者 MasonM 2018-05-03 16:51:17
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
char *str_copy(char *a, const char *b)
{
	assert((a != NULL) && (b != NULL));
	char *add = a;
	while ((*a++ = *b++) != '\0');
	return add;
}
char *str_cat(char *a, const char *b)
{
	assert((a != NULL) && (b != NULL));
	char *add = a;
	while (*a != '\0')a++;
	while ((*a++ = *b++) != '\0');
	return add;


}
int str_len(const char *a)
{
	assert(a != NULL);
	int add = 0;
	while (*a++ != '\0')
	{
		add++;
	}
	return add;
}
int main()
{
	//定义两个字符串
	char a[] = { "I am chinese" };
	char b[] = { "I love china" };
	char ab[30];	
	//比较两个字符串的长度,根据结果连接字符串,并输出连接后的字符串
	if (str_len(a) >= str_len(b))
	{
		cout << str_copy(ab, a);
		cout << str_cat(a, b);
	}
	else
	{
		cout << str_copy(ab, b);
		cout << str_cat(b, a);
	}
	system("pause");
	return 0;
}

老师代码这样写还是会报错呢,而且输出变成I am chineseI am chineseI love china的,该怎么办?谢谢老师!

好帮手慕查理 2018-05-02 14:58:40

您好,在连接字符串之前需要将判断到的长的字符串拷贝到数组中,再将短的字符串写入其中。

参考:

http://img1.sycdn.imooc.com//climg/5ae96114000131dc04660326.jpg

PS:对于为题中有代码的,请同学复制粘贴反馈代码,不要将代码截图。

祝学习愉快!

  • 提问者 MasonM #1
    不可以像我的代码那样,if语句已经把两个字符串长度判断出来之后,直接在str_cat函数中进行字符串连接吗?
    2018-05-02 21:02:17
  • imooc_澈 回复 提问者 MasonM #2
    你好,字符串拼接确实是使用str_cat函数来执行的,但是const关键字限制了已经定义好的a,b字符串长度,不能在函数中直接将字符串b连接到字符串a后面,反之也不能直接将a连在b后面,否则内存不够就会报错,而是要定义一个长度足以容纳这两个字符串的空字符数组,先将其中一个字符串copy进去,再将另一个字符串连到后面。
    2018-05-03 09:43:49
  • 提问者 MasonM 回复 imooc_澈 #3
    噢!好的谢谢老师!
    2018-05-03 10:28:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
C++零基础入门 热门编程语言 二级考试必备
  • 参与学习       529    人
  • 提交作业       110    份
  • 解答问题       594    个

无论您是零基础、还是想晋升,亦或是想转型,C++无疑都是最佳选择。本路径共分为基础语法、指针与引用、面向对象三大模块,为你开启入门C++编程的大门!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师