【问题标题】:copy a c string into a char array将 c 字符串复制到 char 数组中
【发布时间】:2015-06-02 20:16:28
【问题描述】:

C 新手,仍然掌握指针。我正在尝试将 c 字符串的副本添加到 char 数组中,这样

char temp[40];
temp[0] = 'a';
temp[1] = 'b';
temp[2] = 'c';
temp[3] = NULL;
char *container[40] = {0};
strcpy(container[0], temp);
cout << container[0] << endl;

打印“abc”。尝试制作副本,因为 temp 不断被新字符替换,并且指向 temp 的指针显然不够,因为我想在打印 abc 后这样做。

char temp[40];
temp[0] = 'd';
temp[1] = 'e';
temp[2] = 'f';
temp[3] = NULL;
char *container[40] = {0};
strcpy(container[1], temp);
cout << container[1] << endl;

打印'def'。 PS这是我到目前为止所拥有的,但它不起作用。我不太确定我是否错误地使用了 strcpy,但任何替代方法都会有所帮助。

【问题讨论】:

  • 你使用的不是C,而是C++。
  • container[0] 只是一个指向char 的指针。在调用 strcpy 之前,您必须将其指向足够的内存。
  • C 还是 C??它是哪一个?这些是 C 技术,而是 C++ 语言。而且您在问题中使用了这两个术语....
  • 另外,一个C字符串一个char数组....

标签: c++ arrays


【解决方案1】:

你正确地使用了strcpy,但是你没有给它适当的内存。这就是为什么您的两个程序都有未定义的行为 - 它们写入由未初始化指针指向的内存。

要解决此问题,请使用 malloccontainer 的每个元素分配内存:

char temp[40];
temp[0] = 'a';
temp[1] = 'b';
temp[2] = 'c';
temp[3] = NULL;
char *container[40] = {0};
container[0] = (char*)malloc(strlen(temp)+1);
strcpy(container[0], temp);
cout << container[0] << endl;

您需要将1 添加到strlen 的结果中,以适应您的C 字符串的空终止符。 请注意,malloc 的强制转换是必要的,因为您使用的是 C++;在 C 中,malloc 前面的演员表可以去掉。

注意:我认为这是学习使用“原始”指针的方法的学习练习,因为 C++ 为使用字符串提供了更好的工具。特别是,您的容器可以替换为 std::vector&lt;std::string&gt;,它会随着您向其中添加项目而动态增长,并管理自己的内存,从而无需使用 mallocstrcpy

【讨论】:

  • 一开始可能值得警告不要这样做?你也拼错了“容器”。
  • 问题。这会是等价的吗?到 char *container[] = {"abc" ,"def"}。在幕后是将参数存储为 cstrings 并为其分配内存吗?注意:我意识到它们是静态值。
  • @zzzzz 是的,这在内存布局方面是等价的,除了两件事:容器将有两个元素而不是 40,您需要使用 const char *container[40] 声明它const,因为 C++ 要求将 C 字符串声明为常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2012-10-11
  • 2016-02-05
  • 2015-04-14
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多