字符串c++操作

String c++ manipulation

本文关键字:操作 c++ 字符串      更新时间:2023-10-16

为什么下面的代码有编译错误?

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str="abc";
    string result=str[0];
    cout<<result<<endl;
    return 0;
}

但是,以下代码运行良好:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str="abc";
    str=str[0];
    cout<<str<<endl;
    return 0;
}

我在unix中工作,编译命令是:"g++-gtest.cpp-std=c++11-o a",然后是m/

编译后第一个test.cpp的错误是:

test.cpp:9:21: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
  string result=str[0];
                     ^
In file included from /usr/um/gcc-4.8.2/include/c++/4.8.2/string:52:0,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/bits/locale_classes.h:40,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/bits/ios_base.h:41,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/ios:42,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/ostream:38,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/iostream:39,
                 from test.cpp:1:
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/basic_string.h:490:7: error:   initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' [-fpermissive]
       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
       ^

std::basic_string没有任何接受单个CharT参数的构造函数。这意味着std::string(即std::basic_string<char>)不能由单个char构造。

然而,该类确实有一个接受单个CharT参数的赋值运算符重载,这就是第二个示例编译的原因。

这两种情况的区别在于,在第一种情况下,您执行复制初始化,这意味着从技术上讲,您首先尝试从char参数构造一个临时std::string实例,然后将其复制到result。在第二步中,您将执行赋值,这意味着为现有std::string实例分配一个新值。


basic_string确实有一个构造函数,它接受一个后面跟着字符的计数:

basic_string(size_type count, CharT ch, const Allocator& alloc = Allocator());

因此,如果您将有问题的行更改为,您的原始示例将编译

string result = {1, str[0]};

以下代码也可以正常工作:

string result;
result=str[0];

这意味着初始化和简单分配之间的区别,如果你检查错误:

error: invalid conversion from ‘char’ to ‘const char*’

应该清楚的是,初始化并不像赋值那样"功能齐全"——没有接受char参数的string构造函数(接受char的赋值,这就是为什么第二个例子有效)。

你可以通过确保用字符串而不是字符初始化来修复它(在一种方式中,毫无疑问还有其他方式):

string result = str.substr(0,1);

str[0]返回一个char&,但是没有从char&到std::string

尝试thins而不是

string result = string(1, str[0]);