# 1.char* 与 char[]
C是C++的子集,在C中没有 string
类型,只能使用间接的形式表示。C
中的字符串处理函数包含文件
#include<cstring>
处理的类型是 const char*
类型,所以不能用来处理 std::string
类型的字符串
- C中字符串表示
#include<string.h> // strlen包含在此头文件中
// #include<cstring> or
char* str1 = NULL;
char arr_char[] = "string in c";
str1 = arr_char;
arr_char[0] = 'f';//correct
*str1 = 'd';// correct
char *str2 = "string in c2";
*str2 = 'f';//compiled successful, runtime error;
char *str3 = NULL;
str3 = "string in c3";
- char与char[]最本质的区别是:
**最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,而char符串存储在常量区,只能读没有写的权限** 注:先通过数组定义字符串,再使用指针去修改字符串某个位置的字符可修改成功,因字符数组的内容已经存储在了全局数据区或栈区 - 字符串尾的结束符为
\0
,使用诸如char s[]="this"
,char s[4] = {'t','h','i','s'}
时会自动为末尾添加'\0'
,但使用char s[] = {'t','h', 'i', 's'}
声明时会无法输出正确的结果cout << s
。因字符串的结束标志是\0
,故将在遇到8位全为0的地址时才会输出。
- 如何获取char对应的ASCII码,从Ad到z递升,Use int() to Get ASCII Value of char.
- Use char() to Convert ASCII Value to Char.
- A65a97048
# 2.C中常用的字符串处理函数
- 字符串连接函数strcat和strncat示例:要求
char * strcat ( char * destination, const char * source ); char * strncat ( char * destination, const char * source, size_t num );
s1
对应的内存有足够的空间来容纳s2
中的内容。// strcat char s1[5] = "s"; char s2[3] = "he"; strcat(s1, s2); cout << "strcat res: " << s1 << endl;
- 字符串拷贝函数strcpy和strncpy
char * strcpy ( char * destination, const char * source ); char * strncpy ( char * destination, const char * source, size_t num );
destination
所指向的内存需有足够的空间来存放source
- 字符串比较函数
strcmp
对两个字符串自首至尾逐个字符相比较,直至出现不同的字符或遇到int strcmp ( const char * str1, const char * str2 ); // 取str1和str2的前num个字节进行比较 int strncmp ( const char * str1, const char * str2, size_t num );
\0
为止。如全部字符都相同,则认为相等, 返回0;若出现不同的字符,则以第一个不相同的字符比较结果为准,若str1
的不相同字符的ASCII码值小于str2
则返回一个负数-1
,否则返回一个正数1
。 - 求字符串长度strlen,不包括
\0
- 查找子串strstr示例:返回
char * strstr ( char * str1, const char * str2 );
str2
第一次出现在str1
的位值的指针char *sub = strstr(s1, s2); cout << "sub: " << sub << "\t len: " << strlen(sub) << endl;
- 统计
str1
中的字符有多少在str2
中, strspn示例:size_t strspn ( const char * str1, const char * str2 );
int i; char strtext[] = "1229th"; char cset[] = "1234567890"; i = strspn (strtext,cset); printf ("The initial number has %d digits.\n",i);
# 3. C++中的标准库类型std::string
std::string
类型的字符串是 c++
中的 basic_string class
基本字符串类型,std::string
中提供了丰富的 searching\replacement\manipulation
函数,使用十分方便,故 C++
中通常优先使用,需要包含的头文件为:
#include<string>
using std::string;
- 备注:
C++
标准库不仅定义了C++
语言相关的功能,也兼容了C
语言的标准库,只是在C语言中标准库形如name.h
,在C++
中改成了形如cname
的形式。 - 字符串遍历
string sr = "this is the fuck.";
for(char c : sr)
{
cout << c << endl;
}
- substr
std::string str2 = str.substr (2,5); // "I think"->"think" (pos,len)inclue pos
- void push_back (char c)
- std::string::pop_back
# 4.类型转换
- (1) number to string
// 1.
int number = 1234;
std::string tmp = std::to_string(number);
const char *num_char = tmp.c_str();
// 2.
int number = 1234;
char num_char[MAX_DIGITS + sizeof(char)];
std::to_chars(num_char, num_char + MAX_DIGITS, number)
// 3.
int number = 1234;
std::stringstream tmp;
tmp << number;
char const *num_char = tmp.str().c_str();
- string to number1 (opens new window)
std::stoi(number_str)
# 5.stringstream
# 5.1数字转string
int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
# 参考资料
← C++中的左值和右值 C++中的智能指针 →