这段C++代码不能按照预期运行,请问错在哪里?
谁也不乐意照著图片把作业代码敲一遍的。所以只能人肉编译器胡乱编译运行一下了,产生任何「未定义行为」,均由题主解决,本人概不负责。
这代码毛病挺多,不想一一说了,最主要的就是一个:z 字元串没有初始化。z 里面的内容是不确定的,而 strcat 要先找到 z 的尾巴,这个尾巴在哪里,很不好说。这程序居然没有立即崩溃不错了,还要啥自行车。
你为什么不把每个中间结果列印一下然后自己看呢?
首先知乎程序员本来就很多,其次知乎ers一向不提倡在知乎上求助作业,再者你的程序实在称不上是C++:毕竟全程序只有cout勉强算得上是c++特性。因此被很多人喷想必也是情理之中吧。
不过我能理解。很多学校教的C++程序基础都是披著皮的,基本都是C with cincout(甚至算不上C with STL)
第一次见到*strcat,请教一下,你这样是想干啥?
12/29答案有错误,修改。
主要有以下问题:
- z没有初始化赋值0, char[a] = {0}。如果不初始化赋值0,则不知道这段内存里开始存的是什么东西,后面的strcat很可能无法找到应该从哪里开始放置字元。赋值为0,则会从最开始拷贝。
- *strcat这个不应该算漏洞吧,但没必要这没写。strcat返回的是指向首字母的指针,采用*运算符得出的是首字母,但你并没有使用,因此可以直接去掉*。
其实这段代码并没有使用很多的C++特性,如果题主的想法是定义两个字元串并合并,然后一个一个输出,可以看看C++新加入的一个类string,它有很多直接且安全的方法可以实现你要的功能。
这代码看得我...,既然你写的是C++,那我就说点问题好了
几个问题
- 要不就全用C++,要不就全用C,不要混著用,看著怪难受的
- using namespace std 这种陋习就不要再写了,多写几个std::死不了
- 请不要用&这种写法,请使用&
- 列印C字元串请使用printf
- 你那两个strcat前面加*是想干嘛...
- 请直接在for语句里面定义i,C++认为这是合法的
- sizeof函数返回的是size_t, 请不要写这种含有隐式类型转换的语句,请使用static_cast&(sizeof(xxx))
- x, y 是两个常量的字元串,所以你的z才没有报错,这不是C,不存在用int来给数组开空间的可变数组,你这么写很奇怪,同时请初始化z,至少给它一个
这个问题的回答著实把我逗乐了,虽然在考试周,还是来花几分钟答一下,以防题主被知乎精英带到知乎式编程上。
首先我假定题主是大一上期末,刚接触编程。另外我没用过vc,只用过vs,我假定这两者在我所谈到的方面是一致的。
题主这个代码风格比较好,比我见的学了半年程设的多数人都强,缩进、大括弧一致,函数与头文件之间的空行也注意到了,你别看某些答主说这代码多烂多烂,他们自己写出来的代码很可能没这么漂亮。风格上如果说有啥需要注意的话,你两次strcat中对于逗号处理的不一致是个问题,不过这是小问题,相信你没用过格式化工具,那么写成这样真的很不错了。
再说你问的问题,前几行代码都是对的,问题是从strcat那里开始的。确实如某些人所说,你的数组z没初始化,但是几乎没人说到真正的问题,为什么没输出云云,要知道字元串不初始化的经典后果是烫烫烫而不是空串。
虽然我现在在用手机,没空跑你的程序,但是我和那些见不得图的知乎精英有所差别,我倾向于在脑子里跑,因为这就十来行的基本代码,如果这东西还非要上机实战,那要脑子干什么呢?
strcat(z, x)时会先试图找到字元串z的结尾,再将x复制到后面。但是由于你的z没初始化,所以里面的值是未定义的,对vc来说这应该是0xcc,而找结尾要找到0,所以strcat找遍z都找不到0,于是它到z之外的空间去找(这些空间不归你管,你也不应该访问,更不应该修改),它早晚会找到一个0,然后往后面复制字元串x的内容——嘭!程序炸了。
此时由于你试图修改非法内存,出现了运行时错误(Runtime Error)。如果你在调试的话,vc会有弹窗告诉你内存0x********发生了冲突,但如果你在「开始执行(不调试)」的话,那么控制台会停滞几秒钟,然后出现「请按任意键继续」(Press any key to continue)。
所以并不是什么都没有输出,而是程序已经崩溃了(如果没有崩溃的话,理应会输出一堆「烫」再加正确答案的)。
改当然也很简单,第一步初始化z,我建议你写成z[a] = 「」;而不是其他人推荐的大括弧,用空串具有更强的可读性。改这个还不够,因为你cout时边界用的sizeof(z)而非strlen(z),这是有问题的,可能不影响你看到的答案,但确实是bug。
另外你初始化x y时的大括弧是不必要的,加上它们会让别人难以理解你的意思,strcat前的*同样不必要。
#include &
#include &
using namespace std;
int main() {
string s1 = "you are nice";
string s2 = "yes";
string s3 = s1 + s2;
for (auto s : s3) {
cout &
这种写法好麻烦……
明明
string a="you are nice";
string b="yes";
a+=b;
cout &就行了……
不错了,至少会 return 0 了(逃
要是我有时间(aka. 闲的蛋疼)的话就给你写个现代 C++ 的解法
两个方法:
- char z[a] {""}; 即给z初始化一个空字元串
- 或者把第一个strcat 改成 strcpy
把 * 去掉,虽然留著不会报错,但是你这边是调用两个函数,而不是想要对调用完的返回的指针取 *
另外,强烈建议使用string。 C++不推荐使用C-style的string
难道教材还是vc6的,vs都2019了。。。20年都快有了吧。。。
- char array z needs to be initialized for strcat to work properly
- to print a C-style string, use printf, preferably
- there is no point to dereference strcat since dereferencing should yield no side effect in this case
这都2020了,还有用VC6. 0的?
数组大小是不能改变
要不是你没有按照预期学习
就是你老师没有按照预期讲课
如果你不是计算机专业的 建议弃坑
#define _CRT_SECURE_NO_WARNINGS
#include &
#include &
#include &
void main()
{
char x[20]="you are nice";
char y[]=" yes";
strcat(x,y);
printf("%s
",x);
}
补充:
1.质疑void main()这种写法的同学,你的C语言老师就是摸鱼的,会教出一水的废材,赶快逃离
2.提问者是大一新生,布置作业应该全是C语言的,很多回答却用C++的cout给答案,
本来初学者就蒙B,再整个对象,是让提问者从入门到放弃的节奏
你的代码没错只是写法非常奇怪,char[]声明编译器会自动为空数组额外加个结束符。没看见结果只是可能需要在命令行./exe的方式运行,或者换个编译器。
我觉得是编译器的问题,要不就是操作系统有bug。
建议换台电脑试试
少用sizeof,sizeof会使代码变得丑陋。
推荐阅读: