用的是VC6.0,想把两字元数组连接起来,为啥运行时什么都没有啊,感谢大家解答!


谁也不乐意照著图片把作业代码敲一遍的。所以只能人肉编译器胡乱编译运行一下了,产生任何「未定义行为」,均由题主解决,本人概不负责。

这代码毛病挺多,不想一一说了,最主要的就是一个:z 字元串没有初始化。z 里面的内容是不确定的,而 strcat 要先找到 z 的尾巴,这个尾巴在哪里,很不好说。这程序居然没有立即崩溃不错了,还要啥自行车。


你为什么不把每个中间结果列印一下然后自己看呢?


首先知乎程序员本来就很多,其次知乎ers一向不提倡在知乎上求助作业,再者你的程序实在称不上是C++:毕竟全程序只有cout勉强算得上是c++特性。因此被很多人喷想必也是情理之中吧。

不过我能理解。很多学校教的C++程序基础都是披著皮的,基本都是C with cincout(甚至算不上C with STL)


第一次见到*strcat,请教一下,你这样是想干啥?


12/29答案有错误,修改。


主要有以下问题:

  1. z没有初始化赋值0, char[a] = {0}。如果不初始化赋值0,则不知道这段内存里开始存的是什么东西,后面的strcat很可能无法找到应该从哪里开始放置字元。赋值为0,则会从最开始拷贝。
  2. *strcat这个不应该算漏洞吧,但没必要这没写。strcat返回的是指向首字母的指针,采用*运算符得出的是首字母,但你并没有使用,因此可以直接去掉*。

其实这段代码并没有使用很多的C++特性,如果题主的想法是定义两个字元串并合并,然后一个一个输出,可以看看C++新加入的一个类string,它有很多直接且安全的方法可以实现你要的功能。


这代码看得我...,既然你写的是C++,那我就说点问题好了

几个问题

  1. 要不就全用C++,要不就全用C,不要混著用,看著怪难受的
  2. using namespace std 这种陋习就不要再写了,多写几个std::死不了
  3. 请不要用&这种写法,请使用&
  4. 列印C字元串请使用printf
  5. 你那两个strcat前面加*是想干嘛...
  6. 请直接在for语句里面定义i,C++认为这是合法的
  7. sizeof函数返回的是size_t, 请不要写这种含有隐式类型转换的语句,请使用static_cast&(sizeof(xxx))
  8. 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++ 的解法


两个方法:

  1. char z[a] {""}; 即给z初始化一个空字元串
  2. 或者把第一个strcat 改成 strcpy

把 * 去掉,虽然留著不会报错,但是你这边是调用两个函数,而不是想要对调用完的返回的指针取 *

另外,强烈建议使用string。 C++不推荐使用C-style的string


难道教材还是vc6的,vs都2019了。。。20年都快有了吧。。。


  1. char array z needs to be initialized for strcat to work properly
  2. to print a C-style string, use printf, preferably
  3. 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会使代码变得丑陋。


推荐阅读:
相关文章