2012-07-26 126 views
0

所以我最近一直在C++,C#和Java之间来回切换,并编写了一些C++代码,我做了这样的事情。C++连接糟糕

string LongString = "Long String"; 

char firstChar = LongString.at(0); 

,然后试图用看起来像这样的方法,

void MethodA(string str) 
{  
//some code  
cout << str;  
//some more code } 

这里是我是如何实现它。

MethodA("1. "+ firstChar); 

尽管在C#和Java中完全有效,但在C++中做了一些奇怪的事情。

我预计像

// 1。 L

但它给了我稍后在程序中的其他字符串文字的一部分。

我究竟做了什么?

我应该注意我已经修复了这个错误,以便打印出我期望的内容,但是我真的对我错误地做了什么感兴趣。

提前致谢。

+0

可能重复的[可以字符串文字和字符文字连接?](http://stackoverflow.com/questions/635807/can-a-string-literal-and-a-character-literal-be-串联) – ecatmur 2012-07-26 18:01:50

+0

@cdhowie感谢您的编辑。我如何获得语法高亮功能?我想下次自己做。 – Dan 2012-07-26 19:02:10

+0

@Dan您可以点击编辑链接查看编辑后的文本。 – cdhowie 2012-07-26 19:03:03

回答

3

C++没有定义的添加对字符串文字作为串联。相反,字符串文字衰减为指向其第一个元素的指针;一个字符被解释为一个数值,所以结果是一个指针从程序的只读存储器段中的一个位置偏移到另一个位置。

为了获得另外作为级联,使用std::string

MethodA(std::string() + "1. " + firstChar); 
+0

请注意,这会将参数的类型从'const char *'更改为'std :: string'(根据'MethodA'的声明,这可能很好或不会)。另外,等价但稍好:'std :: string(“1。”)+ firstChar' – 2012-07-26 18:04:21

2
MethodA("1. "+ firstChar); //your code 

不做你想做的事。它是一个指针算术:它只是将一个整数值(即firstChar)添加到字符串文字"1. "的地址,然后将结果(它是char const*类型)传递给该函数,并在该函数中转换为string类型。根据firstChar的值,它可能会调用未定义的行为。 事实上,就你而言,它会调用未定义的行为,因为生成的指针指向字符串字面之外。

写:

MethodA(string("1. ")+ firstChar); //my code 
+0

@downvoter:请解释downvote所以我可以纠正自己。 – Nawaz 2012-07-26 18:10:17

3
MethodA(std::string("1. ")+ firstChar); 

因为 “1” 是为const char [4]和不具有的concat方法)

2

的问题是,"1. "是一个字符串(字符数组),这将衰变成一个指针。字符本身是char,可以被提升为int,并且const char*int的添加被定义为通过将原始指针偏移多个位置来计算新指针。

你在C++代码与添加(int)firstChar(字符的ASCII值),以字符串文字"1. ",其中如果firstChar的值大于4(它可能是)将是不确定的行为的结果调用MethodA

1

C++中的字符串常量不是std::string的实例,而是常量数组char s。因此,通过向其添加一个char对字符指针的隐式转换,然后将该字符的数值递增,发生了指向存储在.data段中的另一个字符串字面值的情况。