如何在没有函数调用的情况下在c ++中连接const char *字符串?

时间:2011-12-12 03:17:52

标签: c++ concatenation string-concatenation

Ps:这更像是一个概念性问题。

我知道这让事情变得更加复杂,没有充分的理由,但这就是我想知道的。如果我没弄错的话,c ++中的const char* "like this"指向l并且在编译时将自动归零。我相信它正在创建一个临时变量const char*来保存它,除非它使用字节变量跟踪偏移(我没有检查反汇编)。我的问题是,如果可能的话,你怎么会在不调用函数或实例化字符串的情况下为这个字符串添加字符?

示例(这是错误的,只是为了让您可以看到我的意思):

"Like thi" + 's';

我想出的最接近的事情是将它存储到const char*,并留出足够的空格并更改其他字符。

示例:

char str[9];
strcpy(str, "Like thi")
str[8] = 's';

澄清: 投票结果:此问题未显示任何研究成果;它不清楚或无用

好的,所以这个问题已被高度评价。关于我的问题缺乏哪些原因并没有多少推理,所以我会尝试提高所有这些品质。

我的问题更多,所以我可以更好地理解当你只是创建一个字符串"like this"而不在const char*中存储该字符串的地址时会发生什么我也想知道它是否是可以在不使用strcat()之类的函数的情况下连接/更改该字符串的内容,而无需使用类字符串中的重载运算符+。我知道这对于处理C ++中的字符串并不是很有用,但我很好奇是否除了标准方法之外还有其他方法。

string example = "Like thi" + "s"; //I'm aware of the string class and its member functions
const char* example2 = "Like this"; //I'm also aware of C-type Strings (CString as well)

也可能没有英语作为我的母语使事情变得更糟,我为这种困惑道歉。

2 个答案:

答案 0 :(得分:3)

您应该使用C ++库提供的字符串库,而不是使用普通的char字符串:

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string str = "Like thi";
    cout << str << endl;

    str = str + "s";
    cout << str << endl;
    return 0;
}

通常,不可能简单地在C或C ++中连接普通的char *字符串,因为它们只是指向字符数组的指针。如果您打算在自己的代码中进行任何字符串操作,那么几乎没有理由在C ++中使用裸字符数组。

即使您需要访问C表示(例如,对于外部库),您也可以使用string::c_str()

答案 1 :(得分:2)

首先,没有任何null终止,但零终止。 C中的所有char *字符串都以'\0'结尾。

当您在代码中执行以下操作时:

char *name="Daniel";

编译器将生成一个包含内容的字符串:

Daniel\0

并将在程序执行期间的某个时间初始化name指针指向它,具体取决于变量context(member,static,...)。

name的任何内容添加到您想要的工作中,因为name指向的内存不可更改,并且您可能会遇到访问冲突错误或将覆盖其他内容。

具有

const char* copyOfTheName = name;

不会创建相关字符串的副本,只会copyOfTheName指向原始字符串,所以

copyOfTheName[6]='A';

将与

完全相同
name[6]='A';

只会给你带来麻烦。

请改用std::strcat。并且,请做一些调查基本字符串操作如何在C中工作。