我是C ++的新手,并且从MSDN C ++初学者指南中学习。
尝试使用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;
}
这是输出
Enter your first name: Taher
Enter your last name: Abouzeid
Your name is: Y}@Taher Abouzeid
我想知道为什么Y} @出现在我的名字之前?
答案 0 :(得分:8)
您没有通过将第一个字符设置为'\ 0'来初始化full_name,因此其中包含垃圾字符,当您执行strcat时,您将在垃圾字符后添加新数据。
答案 1 :(得分:4)
您正在创建的阵列中充满了随机数据。 C ++将为数据分配空间,但不会使用已知数据初始化数组。 strcat会将数据附加到字符串的末尾(第一个'\ 0'),因为字符数组尚未初始化(并且充满了随机数据),这不是第一个字符。
这可以通过替换
来纠正char first_name[40],last_name[40],full_name[80],space[1];
带
char first_name[40] = {0};
char last_name[40] = {0};
char full_name[80] = {0};
char space[2] = {0};
= {0}
将第一个元素设置为'\ 0',这是字符串终止符号,c ++将自动用'\ 0'填充所有未指定的元素(假设至少指定了一个元素)
答案 2 :(得分:2)
变量full_name
在被追加到<。p>之前未被初始化
改变这个:
strcat(full_name,first_name);
到此:
strcpy(full_name,first_name);
答案 3 :(得分:1)
您在测试中看不到任何问题,但在使用space
初始化其唯一字符后,您的' '
字符串也不会以空值终止。
答案 4 :(得分:0)
正如其他人所说,你必须初始化数据,但你有没有想过学习标准的c ++库?它有时更直观,而且可能更有效。
有了它:
string full_name=first_name+" "+last_name;
你不必为终止空字符而烦恼。如需参考,请转至cplusplus
哦,这是一个完整的工作示例,因此您可以更好地理解(来自运算符+ =):
#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;
}
答案 5 :(得分:0)
问题在于您的space
文字。
strcat
函数需要一个C风格的字符串,该字符串是零个或多个字符,后跟一个null,终止字符。因此,在为C样式字符串分配数组时,需要为终止空字符分配一个额外字符。
那么,您的space array needs to be of length 2, one for the space character and one for the null character.
Since space
is constant, you can use a string literal instead of an array:
const char space[] = " ";
space
5.投资Scott Myers Effective C ++ 和更有效的C ++ 书籍。
答案 6 :(得分:0)
字符串在C和C ++中以空值终止(strcat函数是C的遗留)。这意味着当您指向随机内存地址(new char []变量指向具有未初始化的随机内容的堆栈地址时),编译器会将所有内容解释为第一个\ 0(null)字符作为字符串(如果使用指针运算,将超出分配的大小)。
这可能导致非常模糊的错误,安全问题(缓冲区溢出漏洞利用)以及非常难以理解和无法维护的代码。现代编译器具有可以帮助检测此类问题的功能。