在C ++中使用strcat函数时会出现奇怪的字符

时间:2009-12-05 22:05:12

标签: c++ strcat

我是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} @出现在我的名字之前?

7 个答案:

答案 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)字符作为字符串(如果使用指针运算,将超出分配的大小)。

这可能导致非常模糊的错误,安全问题(缓冲区溢出漏洞利用)以及非常难以理解和无法维护的代码。现代编译器具有可以帮助检测此类问题的功能。

这是a good summary of your options