# 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();
std::stoi(number_str)

# 5.stringstream

# 5.1数字转string

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
(adsbygoogle = window.adsbygoogle || []).push({});

# 参考资料