添加字符串和字面值(C++)

13 浏览
0 Comments

添加字符串和字面值(C++)

在C++ Primer这本书中,我看到了这样的陈述:“当我们混合使用字符串、字符串或字符字面值时,每个+运算符的至少一个操作数必须是字符串类型。”

我注意到以下内容是无效的:

#include 
int main()
{
    using std::string;
    string welcome = "hello " + "world";    //示例1
    string short_welcome = 'h' + 'w';       //示例2
    return 0;
}

  • 问题1:为什么示例1会生成错误,因为两个操作数都是字符串字面值?
  • 问题2:为什么至少有一个操作数必须是字符串?
  • 问题3:为什么示例2也会生成错误?

我只是想了解幕后发生的事情。

0
0 Comments

在C++中,只能为用户定义的类型重载运算符,例如类std::string。因此,对于基本类型,如字符串字面值,不能重载运算符。

在第一个表达式中,字符串字面值被转换为指向它们的第一个元素的指针。然而,指针没有定义加法运算符。

在第二个表达式中,字符字面值被转换为整数,并且结果是一个整数。然而,std::string类没有接受整数的隐式构造函数。

解决方法可以是:

1. 使用显式构造函数将字符串字面值转换为std::string类型,然后进行拼接,例如:

   std::string welcome = std::string("hello ") + "world"; 
   

或者

   std::string welcome = "hello " + std::string("world");
   

2. 使用std::string类的成员函数来逐步拼接字符串,例如:

   std::string short_welcome(1, 'h');
   short_welcome += 'w';
   

3. 使用C++11中的字符串字面值后缀"s"和命名空间std::string_literals,可以直接拼接字符串,例如:

   auto welcome = "hello "s + "world";
   

0
0 Comments

在这个问题中,出现的原因是用户错误地将字符串写成了字符数组,而不是std::string类型。要解决这个问题,可以通过显式地将它们定义为字符串字面量来克服这个问题。

具体做法是使用字符串字面量的定义方式:

string welcome = "hello "s + "world"s;    //example 1

这是std::string的一部分,定义为operator""。但是需要添加using namespace std::string_literals;才能使用它。

其他问题的解决方法在其他答案中有详细解释。

0
0 Comments

问题的原因:字符串字面量实际上是常量字符数组,它们会衰减为指向其第一个元素的指针。因此,将两个字符串字面量相加实际上是将这些指针相加,结果是一个指向完全不相关位置的指针。对于字符,它们首先会被提升为int类型,然后作为整数相加,结果是一个int类型的值。

解决方法:由于字符串字面量不能直接相加,我们可以使用其他方法来实现字符串的拼接。例如,可以使用字符串拼接函数或运算符来连接两个字符串字面量,或者使用字符数组来存储字符串,并使用相应的函数来操作和拼接字符串。

以下是一个示例代码,演示了如何使用字符数组和字符串拼接函数来拼接字符串:

#include 
#include 
int main() {
    const char str1[] = "hello ";
    const char str2[] = "world";
    
    char result[12]; // 存储拼接后的字符串
    
    strcpy(result, str1); // 将第一个字符串拷贝到结果数组中
    strcat(result, str2); // 将第二个字符串拼接到结果数组中
    
    std::cout << result << std::endl; // 输出拼接后的字符串
    
    return 0;
}

运行以上代码,将输出"hello world"。在这个示例中,我们使用了字符串拼接函数`strcpy`和`strcat`来操作和拼接字符串。首先,我们定义了两个字符数组`str1`和`str2`,分别存储了要拼接的字符串。然后,我们定义了一个足够大的字符数组`result`来存储拼接后的字符串。使用`strcpy`函数将第一个字符串拷贝到结果数组中,然后使用`strcat`函数将第二个字符串拼接到结果数组的末尾。最后,使用`std::cout`输出拼接后的字符串。

通过使用字符数组和字符串拼接函数,我们可以避免直接相加字符串字面量导致的问题,并实现字符串的拼接。

0