标准库string 类型和字符串字面值

时间:2021-06-18 14:47:20
看书看到这一句 很疑惑..

警告:标准库string 类型和字符串字面值
因为历史原因以及为了与 C 语言兼容,字符串字面值与标准
库 string 类型不是同一种类型。这一点很容易引起混乱,编程时一定
要注意区分字符串字面值和 string 数据类型的使用,这很重要

13 个解决方案

#1


string内部应该也是个字符串数组,而且还带着结束符!

#2


标准库string 类型和字符串字面值

#3


引用 1 楼 starytx 的回复:
string内部应该也是个字符串数组,而且还带着结束符!


我看string好像不是你说的这样啊

#4


引用 3 楼 zhudeyun001 的回复:
Quote: 引用 1 楼 starytx 的回复:

string内部应该也是个字符串数组,而且还带着结束符!


我看string好像不是你说的这样啊
上次这版块有人讨论过这样的问题,内部的字符数组应该是有结束符的,但是你不能把string简单的当做字符数组来看待,所以string认为s2[3]是非法的

#5


不就是说
"abc"

string('abc")
不是一回事吗?
参考下面第33行:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string str("This expression could match from A and beyond. [ expression  express ]");
    string rs = "exp\\w*";  // 正则字符串,exp开始的单词
    cout << str << endl;

    regex expression(rs); // 字符串传递给构造函数,建立正则表达式

// regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。
// 注意,这个正则表达式必须匹配被分析串的全部,否则函数返回 false.
// 如果整个序列被成功匹配,regex_match 返回 True.
    bool ret = regex_match(str, expression);
    if (ret)
        cout << "可以匹配整个文本" << endl;
    else
        cout << "不能匹配整个文本" << endl;

// regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。
// 你可以用 regex_search 来查找输入中的一个子序列,该子序列匹配正则表达式 e.
    ret = regex_search(str, expression);
    if (ret)
        cout << "能够搜索到 " << rs << endl;
    else
        cout << "不能搜索" << endl;

// regex_replace 在整个字符序列中查找正则表达式e的所有匹配。
// 这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行格式化。
// 缺省情况下,不匹配的文本不会被修改,即文本会被输出但没有改变。

    str = regex_replace(str, expression, string("表达式"));
// VC2010或者TR1注意:这里第三个参数要用string()转换
// http://www.johndcook.com/cpp_regex.html
// started with C++ TR1 regular expressions
    cout << str << endl;
    return 0;
}
//This expression could match from A and beyond. [ expression  express ]
//不能匹配整个文本
//能够搜索到 exp\w*
//This 表达式 could match from A and beyond. [ 表达式  表达式 ]

#6


一直不知道标准库string类型跟字符串字面值有任何关系
我承认楼主看书看到的这一段话的确让我非常混乱

#7



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


int _tmain(int argc, _TCHAR* argv[])
{
string str("123");
const char *p = str.c_str();
for (int i=0;i<4;i++)
{
cout<<"第"<<i<<"个元素,"<<p[i]<<","<<str[i]<<endl;
}
return 0;

最后一个元素是0,屏幕是打印不出来的

#8


这个问题你还是自己了解一下string类的内部实现就清楚了。

#9


用一个宏 
#define cppT(str) std::string(str)
酱紫用 cppT("My string") 当字符串字面量,或许是个不错选择

#10


简单的说,C,C++原生字符串 即 C字符串,只是带结束符的字符数组,string 不是C++的内置类型;
只是库定义的一种数据类型,和用户定义的类类型没有多少区别,所以不能完全混用。

string 不能完全替代原生字符串(带结束符的字符数组)。
而字符串常量,是常量的原生字符串常量。

#11


电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#12


而字符串常量,是常量的原生字符串常量。不是string 常量。
如果内置了string,那就是string 常量了,好像VC 的 CLI/C++程序是这样的,或者有时是这样的哦!!!

#13


http://andyqjd.blog.163.com/blog/static/16973823020101011103140874/

#1


string内部应该也是个字符串数组,而且还带着结束符!

#2


标准库string 类型和字符串字面值

#3


引用 1 楼 starytx 的回复:
string内部应该也是个字符串数组,而且还带着结束符!


我看string好像不是你说的这样啊

#4


引用 3 楼 zhudeyun001 的回复:
Quote: 引用 1 楼 starytx 的回复:

string内部应该也是个字符串数组,而且还带着结束符!


我看string好像不是你说的这样啊
上次这版块有人讨论过这样的问题,内部的字符数组应该是有结束符的,但是你不能把string简单的当做字符数组来看待,所以string认为s2[3]是非法的

#5


不就是说
"abc"

string('abc")
不是一回事吗?
参考下面第33行:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string str("This expression could match from A and beyond. [ expression  express ]");
    string rs = "exp\\w*";  // 正则字符串,exp开始的单词
    cout << str << endl;

    regex expression(rs); // 字符串传递给构造函数,建立正则表达式

// regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。
// 注意,这个正则表达式必须匹配被分析串的全部,否则函数返回 false.
// 如果整个序列被成功匹配,regex_match 返回 True.
    bool ret = regex_match(str, expression);
    if (ret)
        cout << "可以匹配整个文本" << endl;
    else
        cout << "不能匹配整个文本" << endl;

// regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。
// 你可以用 regex_search 来查找输入中的一个子序列,该子序列匹配正则表达式 e.
    ret = regex_search(str, expression);
    if (ret)
        cout << "能够搜索到 " << rs << endl;
    else
        cout << "不能搜索" << endl;

// regex_replace 在整个字符序列中查找正则表达式e的所有匹配。
// 这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行格式化。
// 缺省情况下,不匹配的文本不会被修改,即文本会被输出但没有改变。

    str = regex_replace(str, expression, string("表达式"));
// VC2010或者TR1注意:这里第三个参数要用string()转换
// http://www.johndcook.com/cpp_regex.html
// started with C++ TR1 regular expressions
    cout << str << endl;
    return 0;
}
//This expression could match from A and beyond. [ expression  express ]
//不能匹配整个文本
//能够搜索到 exp\w*
//This 表达式 could match from A and beyond. [ 表达式  表达式 ]

#6


一直不知道标准库string类型跟字符串字面值有任何关系
我承认楼主看书看到的这一段话的确让我非常混乱

#7



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


int _tmain(int argc, _TCHAR* argv[])
{
string str("123");
const char *p = str.c_str();
for (int i=0;i<4;i++)
{
cout<<"第"<<i<<"个元素,"<<p[i]<<","<<str[i]<<endl;
}
return 0;

最后一个元素是0,屏幕是打印不出来的

#8


这个问题你还是自己了解一下string类的内部实现就清楚了。

#9


用一个宏 
#define cppT(str) std::string(str)
酱紫用 cppT("My string") 当字符串字面量,或许是个不错选择

#10


简单的说,C,C++原生字符串 即 C字符串,只是带结束符的字符数组,string 不是C++的内置类型;
只是库定义的一种数据类型,和用户定义的类类型没有多少区别,所以不能完全混用。

string 不能完全替代原生字符串(带结束符的字符数组)。
而字符串常量,是常量的原生字符串常量。

#11


电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#12


而字符串常量,是常量的原生字符串常量。不是string 常量。
如果内置了string,那就是string 常量了,好像VC 的 CLI/C++程序是这样的,或者有时是这样的哦!!!

#13


http://andyqjd.blog.163.com/blog/static/16973823020101011103140874/