字符串c++操作
String c++ manipulation
为什么下面的代码有编译错误?
#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]);
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 无法合并生成操作.. 先决条件不同