【string 与 char】C++ 中string与char

2023-05-16

C++中string类的定义如下:

/// A string of @c char
typedef basic_string<char>    string;   

对于C++来说,string类型的每个元素都是char类型,如:

string a = "xyz";
char c = a[0];

两个字面量的字符串是不能相加的

string a = "x" + "y";
错误 error: 
invalid operands of types 'const char [2]' and 'const char [2]' to binary 'operator+'

也就是加号(+)没有被重载。

由于string也是一种容器,所以string也有push_back(),pop_back()等函数,其内容就是string的组成char,注意这里只能push_back(char),【不能push_back(string),这是错误的】

string a;
char b = 'y';
a.push_back('x');
a.push_back(b);

C++中有者严格的字符串string 和字符char的区分:
双引号("") 就是const char* 类型的常量字符串字面量。
单引号(’’)就是const char 类型的常量字符字面量。

char b = "y";
错误 error: 
invalid conversion from 'const char*' to 'char'
string a ='x';
错误 error: 
conversion from 'char' to non-scalar type 'std::__cxx11::string'

虽然加号(+)的重载没有两个字符串相加的情况,但是string类提供了加号(+)的重载:

string a = "x";
a = a + "y";

并且此重载还可以加入字符:

string a = "x";
a = a + 'y';

对于字符串中只有单个字符的,仍然是字符串,不能看成字符。如:

string a = "a";
printf("%d",a);
输出:6422000
char a = 'a';
printf("%d",a);
输出:97

在C++中,string是一个类,不需要像C语言那样使用一个\0来标识字符串结束,所以\0对于string来说不是必须的,string类使用类属性来记录字符串长度。

在string类中定义如下:

// Capacity:
///  Returns the number of characters in the string, not including any
///  null-termination.
size_type
size() const _GLIBCXX_NOEXCEPT
{ return _M_string_length; }

并且size()函数和length()函数一样:

///  Returns the number of characters in the string, not including any
///  null-termination.
size_type
length() const _GLIBCXX_NOEXCEPT
{ return _M_string_length; }

string与C语言字符串转换问题:

在string类中有如下函数:【是将string转为char*类型】

// String operations:
/**
 *  @brief  Return const pointer to null-terminated contents.
 *
 *  This is a handle to internal data.  Do not modify or dire things may
 *  happen.
*/
const _CharT*
c_str() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }

/**
 *  @brief  Return const pointer to contents.
 *
 *  This is a pointer to internal data.  It is undefined to modify
 *  the contents through the returned pointer. To get a pointer that
 *  allows modifying the contents use @c &str[0] instead,
 *  (or in C++17 the non-const @c str.data() overload).
*/
const _CharT*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }
string a="abcdef";
const char* x = a.data();
printf("%s",x);
string a="abcdef";
const char* x = a.c_str();
printf("%s",x);

既然%s能够打印出来,说明返回的字符串已经有了\0结尾。

然而string本身并不能被%s打印:

string a="abcdef";
printf("%s",a);
打印不出任何结果,无显示

至于将char*转为string,是任何时候都可以转的。

char* a="abcdef";
string b;
b=a;
char* a="abcdef";
string b = a;

但是此时会报一个警告:

warning: ISO C++ forbids converting a string constant to 'char*'

如下形式,就不会引起警报:

const char* a="abcdef";
string b = a;

因为一个string constant,是const char* 类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【string 与 char】C++ 中string与char 的相关文章

随机推荐