【问题标题】:Insert a char* at the beginning of another char* C++在另一个 char* C++ 的开头插入一个 char*
【发布时间】:2013-11-24 14:53:04
【问题描述】:

我想知道是否有任何方法可以在另一个 char* 的开头插入 char*

例如:

char* a;
char* b;
char* ba;

a="HOW ARE YOU?";
b="HELLO, ";

我想先插入ab,char* b,然后char* a,所以char* ba的内容是

"HELLO, HOW ARE YOU?"

这可能吗?

非常感谢

【问题讨论】:

  • 您不能修改字符串常量。使用std::string,这很容易。
  • Err,问题是我不能在这个特定问题中使用字符串。你知道为什么人们对我的问题投反对票吗?
  • 至少部分问题似乎是您不了解 C 字符串(不是 std::string)和指向字符的指针之间的区别。
  • 我猜是因为你在问如何做你不应该做的事情,而你没有提到你不能使用明显的解决方案。

标签: c++ string pointers char


【解决方案1】:

正如@alan 已经提到的,使用std::string

std::string a = "How are you?", b = "Hello, ", ba;
ba = b + a;

更新:

正如@Vlad 正确指出的那样,字符串常量没有必要使用std::string。您可以改用const char*。但是现在,你不能说

ba = b + a;

不再,因为这会添加字符指针,这是不可能的。

您必须改为将串联拆分为两个操作

const char *a = "How are you?";
const char *b = "Hello, ";
std::string ba;
ba = b;
ba += a;

如果您真的必须使用纯 C 字符串(例如,这是我的作业,否则我的老板威胁要解雇我),您当然可以使用 @Vlad 的方法。但是你应该把它包装在一个函数中,这个函数负责计算和分配。

但是,您仍然必须注意内存问题。您现在负责释放分配的内存。

【讨论】:

  • 这是一个愚蠢的解决方案。没有必要定义两个 std::string 类型的对象,因为底层的字符串字面量不会改变。所以不要写这个愚蠢的代码 std::string a = "How are you?", b = "Hello,";写 const char *a = "How are you?", *b = "Hello, "; 就足够了
  • 你是对的,它不是必要的。但是 OP 显然既不是c 的专家,也不是c++ 的专家。因此,我冒昧地将他推向了“C++ 方式”的字符串处理方向。一旦他掌握了 C 字符串和内存管理的低级部分,他就会学会如何正确地做到这一点。但在那之前,我认为你的评论是一种侮辱,也是危险的。
  • @VladfromMoscow:无论如何,至少必须将一个转换为string 才能连接,所以除非您真的需要进行微优化,否则使用 C 样式指针几乎没有什么意义。我当然不明白使用string 表示字符串有多“愚蠢”。
  • @ Mike Seymour 我认为没有必要引用 std:;string 因为这改变了原始帖子的意义。我认为原始帖子已经定义了两个指针,并且需要定义第三个指针,该指针将指向连接的字符串文字。
【解决方案2】:

如果 ba 指向一个动态分配的数组或者本身就是一个可以容纳这两个字符串字面量的数组,则没有问题。例如

char *ba = new char[ std::strlen( a ) + std::strlen( b ) + 1];

std::strcpy( ba, b );
std::strcat( ba, a ); 

【讨论】:

  • 这段代码有效,但它是真正可怕的 C++。不要这样写。
  • @khajvah 因为它需要封装以使其安全且易于使用,然后您刚刚重新发明了std::string
  • @Vlad 不,就像我说的那样可怕。事实上,我会在代码审查中拒绝这样的代码。如果学生将其作为作业提交,我会(并且过去!)扣分,原则上,如果 OP 使用手动内存管理,我不会回答 Stack Overflow 的问题:欢迎他们提出他们为自己努力生活,但我不会帮助他们。虽然我不会对这个答案投反对票(这在技术上是正确的),但我对它获得的赞成票数量感到困惑——它不值得他们。
  • 我什至无法认真考虑您的评论。首先,不清楚代码是用 C 还是 C++ 编写的。此外,我认为原始代码是用 C 编写的,因为指向字符串文字的指针没有限定符 const。其次,很明显这是一个关于指针主题的作业。第三,很明显作者不知道智能指针。对于这种简单的操作,不需要使用例如 std:;string ,因为前两个指针是指向字符串文字的指针。所以你的长评论可能只是被作者忽略了。
  • 而“如此简单的操作”,正如您所说,正在全世界造成数百万个软件错误。不完全避免这种错误来源是不负责任的,这在 C++ 中是微不足道的。教授糟糕的代码同样是不负责任的。我们不需要更多蹩脚的代码,我们需要更好的代码。因此,从第一天开始,程序员就开始学习编写干净的代码。
【解决方案3】:

你可以使用:

char * strcpy ( char * destination, const char * source );

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,"copy successful");
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多