在C+;中使用strcat函数时会出现奇怪字符+; 我是C++的新手,学习MSDNC++初学者指南。

在C+;中使用strcat函数时会出现奇怪字符+; 我是C++的新手,学习MSDNC++初学者指南。,c++,strcat,C++,Strcat,在尝试strcat函数时,它起作用了,但我同时得到了三个奇怪的字符 开始 这是我的密码 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char first_name[40],last_name[40],full_name[80],space[1]; space[0] = ' '; cout <&

在尝试strcat函数时,它起作用了,但我同时得到了三个奇怪的字符 开始

这是我的密码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main() {
    char first_name[40],last_name[40],full_name[80],space[1];
    space[0] = ' ';
    cout << "Enter your first name: ";
    gets(first_name);
    cout << "Enter your last name: ";
    gets(last_name);
    strcat(full_name,first_name);
    strcat(full_name,space);
    strcat(full_name,last_name);
    cout << "Your name is: " << full_name;
    return 0;
}

我想知道为什么Y}@出现在我的名字之前?

您没有通过将第一个字符设置为“\0”来初始化全名,因此其中包含垃圾字符,并且当您在垃圾字符之后添加新数据时。

您在测试中看不到任何问题,但是,在使用
'

初始化字符串的唯一字符后,
空格
字符串也不会以null结尾。变量
全名
在附加到字符串之前不会被初始化

更改此项:

strcat(full_name,first_name);
为此:

strcpy(full_name,first_name);

您正在创建的数组中充满了随机数据。C++将分配数据的空间,但不使用已知数据初始化数组。strcat将把数据附加到字符串的末尾(第一个“\0”),因为字符数组尚未初始化(并且充满随机数据),这将不是第一个字符

这可以通过更换

char first_name[40],last_name[40],full_name[80],space[1];


< > >代码>={ 0 } /CONT>将第一个元素设置为“字符串0终止符”,“C++”将自动填充所有非指定元素,并用“0”指定(至少指定一个元素)。

正如其他人所说的,必须初始化数据,但你是否想过学习标准C++库?它有时更直观,可能更有效

这将是:

string full_name=first_name+" "+last_name;
您不必费心终止空字符。如需参考,请访问

哦,还有一个完整的工作示例,以便您能够更好地理解(从运算符+=):

#包括
#包括
使用名称空间std;
int main()
{
字符串名(“John”);
弦家族(“史密斯”);
name+=“K.”;//c-string
name+=family;//字符串
名称+='\n';//字符

cout问题在于你的
空格
文本

strcat
函数需要一个C样式字符串,该字符串是零个或多个字符,后跟一个空的终止字符。因此,为C样式字符串分配数组时,需要为终止的空字符分配一个额外的字符。

因此,
空格数组的长度必须为2,一个用于空格字符,一个用于空字符。

由于
space
是常量,因此可以使用字符串文字而不是数组:


常量字符空间[]=“”;
另外,由于您是新手,这里有一些提示:
1.每行声明一个变量。
这将更容易修改和更改变量类型。

2.刷新
std::cout
,使用
std::endl
,或包含一个“\n”。
这将刷新缓冲区并显示任何剩余文本。

3、阅读C++语言常见问题解答。

4.使用std::string可以避免C样式的字符串问题

5、投资Scott Myers有效C++和更有效的C++书籍。

字符串在C和C++中是空的(STRCAT函数是C的继承)。这意味着当你指向一个随机内存地址(新的char []变量指向一个栈地址,它的随机内容没有初始化)。,编译器将把第一个\0(null)字符之前的所有内容解释为字符串(如果使用指针算法,则会超出分配的大小)

这可能会导致非常模糊的bug、安全问题(缓冲区溢出漏洞)以及非常不可读和不可维护的代码。现代编译器具有可以帮助检测此类问题的功能


这里是。

另外,
空格
不是以null结尾的。True。需要使用大小为2的字符串定义
空格
数组,并使用字符串
而不是只需稍加修改即可工作的字符
。我将字符空格替换为字符空格[2]={0};这很好用。请在答案中更改它,以便我可以接受。AAAAAH!
get()
它远离我们!它灼伤了我们!
char first_name[40] = {0};
char last_name[40] = {0};
char full_name[80] = {0};
char space[2] = {0};
string full_name=first_name+" "+last_name;
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string name ("John");
  string family ("Smith");
  name += " K. ";         // c-string
  name += family;         // string
  name += '\n';           // character

  cout << name;
  return 0;
}