在C+;中使用strcat函数时会出现奇怪字符+; 我是C++的新手,学习MSDNC++初学者指南。
在尝试strcat函数时,它起作用了,但我同时得到了三个奇怪的字符 开始 这是我的密码在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 <&
#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;
}