2

我是 C++ 的新手,正在学习 MSDN C++ Beginner's Guide。

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

4

7 回答 7

9

您不是通过将第一个字符设置为 '\0' 来初始化 full_name ,因此其中有垃圾字符,并且当您 strcat 时,您将在垃圾字符之后添加新数据。

于 2009-12-05T22:08:21.867 回答
5

您正在创建的数组充满了随机数据。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' 填充所有未指定的元素(前提是至少指定了一个元素)。

于 2009-12-05T22:13:27.643 回答
2

该变量full_name在附加到之前没有被初始化。

改变这个:

strcat(full_name,first_name);

对此:

strcpy(full_name,first_name);
于 2009-12-05T22:11:04.887 回答
1

您在测试中看不到任何问题,但您的space字符串在初始化其唯一字符后也不是空终止的' '

于 2009-12-05T22:09:58.540 回答
0

就像别人说的,你必须初始化数据,但是你有没有想过学习标准的c++库?有时它更直观,并且可能更有效。

有了它:

string full_name=first_name+" "+last_name;

而且您不必为终止空字符而烦恼。如需参考,请访问cplusplus

哦,还有一个完整的工作示例,以便您更好地理解(来自 operator+=):

#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;
}
于 2009-12-05T22:35:04.697 回答
0

问题出在你的space文字上。

strcat函数需要一个 C 风格的字符串,它是零个或多个字符,后跟一个空字符,终止字符。因此,在为 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[] = " ";

Also, since you are a newbie, here are some tips:
1. Declare one variable per line.
This will be easier to modify and change variable types.

2. Either flush std::cout, use std::endl, or include a '\n'.
This will flush the buffers and display any remaining text.

3. Read the C++ language FAQ.
Click here for the C++ language Frequently Asked Questions (FAQ)

4. You can avoid C-style string problems by using std::string


5. 购买 Scott Myers Effective C++More Effective C++书籍。

于 2009-12-05T22:43:31.893 回答
0

字符串在 C 和 C++ 中以 null 结尾(strcat 函数是 C 的遗留函数)。这意味着当您指向一个随机内存地址时(新的 char[] 变量指向一个堆栈地址,其中包含未初始化的随机内容),编译器会将第一个 \0(空)字符之前的所有内容解释为字符串(如果您使用指针算法,将超出分配的大小)。

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

这是您的选择的一个很好的总结

于 2009-12-05T23:30:56.270 回答