精华内容
下载资源
问答
  • C++字符串的拼接

    万次阅读 多人点赞 2019-08-15 14:18:51
    C++字符串的拼接 字符串拼接是指将两个字符串连接在一起,形成一个更长的字符串 #include <iostream> int main(int argc,const char* argv[]) { std::string str1 = "Hello ;" std::string str2 = "World!...

    C++字符串的拼接

    字符串拼接是指将两个字符串连接在一起,形成一个更长的字符串

    #include <iostream>
    
    int main(int argc,const char* argv[])
    {
    
    	std::string str1 = "Hello ";
    	std::string str2 = "World!";
    	//append(char* )将字符串str2拼接到字符串str1后面。
    	str1.append(str2);
    	std::cout << str1 << std::endl;
    
    	std::string str3 = "Hello ";
    	std::string str4 = "Hello World!";
    
    	/*
    	append(str4,6,,6))将字符串str4的第6个字符开始的连续6个字符,拼接到字符串str3的后面
    	该函数的第二个参数是从第一个参数的第一个字符开始计算,注意从0开始计算
    	地三个参数是从第二个参数开始的连续几个字符被拼接
    	*/
    	str3.append(str4,6,6);
    	std::cout << str3 << std::endl;
    
    	std::string str5 = "Hello ";
    	//将10个A拼接到字符串str5的后面
    	str5.append(10,'A');
    	std::cout << str5 << std::endl;
    
    	return 0;
    }
    
    展开全文
  • c++字符串与c字符串

    千次阅读 多人点赞 2019-05-27 19:32:26
    c++字符串与c风格字符串1. C风格的字符串2. 字符串字面量3.C++ std::string 类3.1 C风格字符串的优势和劣势3.2 使用string类3.2.1 std::string 字面量3.2.2 c++字符串的数值转换(1)字符串转数值(2)数值转字符串3.2.3...


    你编写的每个应用程序都会使用某种类型的字符串。使用老式C语言时,没有太多的选择,只
    能使用普通的以null结尾的字符数组来表示字符串。遗憾的是,这种表示方式会导致很多问题,例 如会导致安全攻击的缓冲区溢出。C++ STL包含了一个安全易用的std::string类,这个类没有这些 缺点。

    1. C风格的字符串

    在C语言中,字符串表示为字符的数组。字符串中的最后一个字符是空字符(\0’)
    C++包含一些来自C语言的字符串操作函数,它们在< cstring >头文件中定义。

    函数名称 说明
    strlen() 返回字符串长度,不包含空字符‘\0’的一字节,字符串长度不等于字符个数
    strcpy() 字符串拷贝

    C和C++中的sizeof操作符可用于获得给定数据类型或变量的大小。例如,sizeof(char)返回1,
    因为char的大小是1字节。但是,在C风格的字符串中,sizeof()和strlen()是不同的。绝对不要通过 sizeof()获得字符串的大小。如果C风格的字符串存储为char[],则sizeof()返回字符串使用的实际内存,包括‘\0’字符。例如:

    char text[]= "abcdef";
    size_t s1= sizeof(text); // is 7
    size_t s2 = strlen(text); // is 6
    

    但是,如果C风格的字符串存储为char*, sizeof()就返回指针的大小!例如:

    const char* text2 = "abcdef";
    size_t s3 = sizeof(text2); // is platform-dependent
    size_t s4 = strlen(text2); // is 6
    

    在32位模式编译时,s3的值为4,而在64位编译时,s3的值为8,因为这返回的是指针const char*
    的大小。可在<cstring>头文件中找到操作字符串的C函数的完整列表。

    在Microsoft Visual Studio中使用C风格的字符串函数时,编译器可能会给 出安全相关的警告甚或错误,说明这些函数已经被废弃了。使用其他C标准库函数可以避免这些警告,例如
    strcpy_s()和strcat_s(),这些函数是“安全C库” (ISO/IEC TR 24731)标准的一部分。然而,最好的解决方案是切换到C++的 string 类。

    2. 字符串字面量

    注意,C++程序中编写的字符串要用引号包围。例如,下面的代码输出字符串"hello",这段代码
    包含这个字符串本身,而不是一个包含这个字符串的变量:

    cout <<"hello" << endl;
    

    在上面的代码中,"hello”是一个字符串字面量(string literal),因为这个字符串以值的形式写出,
    而不是一个变量。与字符串字面量关联的真正内存在内存的只读部分中。通过这种方式,编译器可 以重用等价字符串字面量的引用,来优化内存的使用。也就是说,即使一个程序使用了 500次"hello"字符串字面量,编译器也只在内存中创建一个hello实例。这种技术称为字面量池
    (literal pooling)。
    字符串字面量可以赋值给变量,但因为字符串字面量位于内存的只读部分,且使用了字面量池,
    所以这样做会产生风险。C++标准正式指出:字符串字面量的类型为“n个const char的数组”,然而为了向后兼容较老的不支持const的代码,大部分编译器不会强制程序将字符串字面量赋值给 const char类型的变量。这些编译器允许将字符串赋值给不带有const的char,而且整个程序可以 正常运行,除非试图修改字符串。一般情况下,试图修改字符串的行为是没有定义的。它可能会导 致程序崩溃;可能使程序继续执行,看起来没有什么莫名其妙的副作用;可能不加通告地忽略修改 行为;可能修改行为是有效的,这完全取决于编译器。例如,下面的代码展示了未定义的行为:

    char* ptr = "hello"; // Assign the string literal to a variable.
    ptr[1] = 'a ';       // Undefined behavior!
    

    一种更安全的编码方法是在引用字符串常量时,使用指向 const 字符的指针。下面的代码包含
    同样的 bug,但由于这段代码将字符串字面量赋值给 const char* 所以编译器会捕捉到任何写入只 读内存的企图。

    const char* ptr = "hello";  // Assign the string literal to a variable.
    ptr[ 1] = 'a';              // Error! Attempts to write to read-only memory
    

    还可以将字符串字面量用作字符数组(char®的初始值。这种情况下,编译器会创建一个足以放 下这个字符串的数组,然后将字符串复制到这个数组。因此,编译器不会将字面量放在只读的内存中,也不会进行字面量的池操作。

    char arr [] = "hello"; // Compiler takes care of creating appropriate sized 
    					   // character array arr.
    arr[ 1] = 'a ';        // The contents can be modified.
    

    3.C++ std::string 类

    C++提供了一个得到极大改善的字符串概念,并作为标准库的一部分提供了这个字符串的实现。 在C++中,std::string是一个类(实际上是basic string模板类的一个实例),这个类支持
    <cstring >中提 供的许多功能,还能自动管理内存分配。string类在std名称空间的< string >头文件中定义。

    3.1 C风格字符串的优势和劣势

    优势 劣势
    很简单,底层使用了基本的字符类型和数组结构 为了模拟一等字符串数据类型,需要付出很多努力
    量级轻,如果使用得当,只会占用所需的内存 使用难度大,而且很容易产生难以找到的内存bug
    很低级,因此可以按操作原始内存的方式轻松操作和复制字符串 没有利用C++的面向对象特性
    能够很好地被C语言程序员理解 要求程序员了解底层的表示方式

    3.2 使用string类

    尽管string是一个类,但是几乎总是可以把string当做内建类型使用。事实上,把string想象为
    简单类型更容易发挥string的作用。通过运算符重载的神奇作用,C++的string使用起来比C字符串容易得多。

    3.2.1 std::string 字面量

    源代码中的字符串字面量通常解释为const char*。使用用户定义的标准字面量”s”可以把字符串
    字面量解释为std::string。例如:

    auto stringl = "Hello World"; // stringl will be a const char*
    auto string2 = "Hello World"s; // string2 will be an std::string
    

    3.2.2 c++字符串的数值转换

    数值转字符串 字符串转数值
    to_string(int val) int stoi(const string& str, size_t *idx=0, int base=10)
    to_string(unsigned val) long stol(const string& str, size_t *idx=0, int base=10)
    to_string(long val) unsigned long stoul(const string& str, size_t *idx=0, int base=10)
    (1)字符串转数值

    int stoi(const string& str, size_t *idx=0, int base=10)

    stoi将n进制字符串转为十进制,第二个参数是字符串起始位置,第三个参数表示n进制

    也可以直接用重载的 int stoi(const string& str),默认字符串为十进制,起始位置为0,制

    #include<string>
    #include <iostream>
    #include <exception>
    using namespace std;
    int main()
    {
    	int i=0;
    	try
    	{
    		i = stoi("FEEF", 0, 16);
    		//int i = stoi("我的"); 输入非法时,可以捕获异常"invalid stoi argument"
    	}
    	catch (exception e)
    	{
    		cout << e.what() << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    输出结果:
    在这里插入图片描述

    (2)数值转字符串

    转十进制可以用to_string,但是低版本的编译器可能不支持

    转多进制可以用_itoa_s,但似乎没有安全机制,导致无法捕获异常

    	char cstr[20];
    	_itoa_s(100,cstr,2);
    	cout << cstr << endl;
    

    转多进制还可以用 stringstream

    #include<string>
    #include <iostream>
    #include <sstream>
    #include <bitset>
    using namespace std;
    int main()
    {
    
       int num = 1234;
       stringstream stream;
    
       //转二进制
       stream << bitset<16>(num);
       cout << stream.str() <<endl;
       stream.str(""); //清空缓存,如果注释掉,那么会输出所有的历史结果
       //转8进制
       stream << oct << num;
       cout << stream.str() << endl;
       stream.str("");
       //转十六进制
       stream << hex << num;
       cout << stream.str() << endl;
       stream.str("");
       system("pause");
       return 0;
    }
    

    结果:
    在这里插入图片描述

    如果需要把格式化后的字符串通过>>输出到字符串, 必须每次都调用clear()方法

    3.2.3 c++常用字符串函数

    函数 功能
    append 将字符添加到字符串的末尾
    at 返回字符串中的指定位置处的元素的引用
    c_str 将字符串的内容转换为 C 样式空终止字符串
    data 转换为字符数组的字符串的内容
    empty 测试是否该字符串包含的字符
    erase 从指定位置字符串中移除元素或某个范围的元素
    find 与指定的字符序列匹配的子字符串的第一个匹配项的向前搜索字符串
    find_first_not_of 搜索与指定任何的字符串元素相匹配的第一个字符的字符串
    find_first_of 搜索与指定任何的字符串元素相匹配的第一个字符的字符串
    rfind 向后方向中的首次出现的与指定的字符序列匹配的子字符串搜索字符串
    pop_back 清除该字符串的最后一个元素
    push_back 该字符串的末尾添加一个元素
    insert 将某个元素的数目或某个范围的元素插入到指定位置的字符串
    length 返回字符串中的元素的当前数目
    replace 替换指定的字符或从其他区域或字符串或 C 字符串复制的字符在字符串中位于指定位置处的元素
    substr 从指定位置的字符串开头的复制的子字符串的最大字符数

    3.2.4 原始字符串字面量

    原始字符串字面量(raw string literal)是可以横跨多行代码的字符串字面量,不需要转义嵌入的双引号,像\t和\1!这种转义序列不按照转义序列的方式处理,而是按照普通文本的方式处理。如果像下面这样编写普通的字符串字面量,那么会收到一个编译器错误,因为 字符串包含了未转义的引号:

    string str = "Hello "World"!// Error!
    

    对于普通的字符串,必须转义双引号,如下所示:

    string str = "Hello \"World\"!";
    

    对于原始字符串字面量,就不需要转义引号了。
    原始字符串字面量的写法:

    string str = R"(Hello "World"!)";
    

    原始字符串字面量可以跨越多行代码。例如,如果像下面这样编写普通的字符串字面量,那么会收到一个编译器错误,因为普通的字符串字面量不能跨越多行:

    string str = "Line 1
    Line 2 with \t"; // Error!
    

    可使用如下原始字符串字面量来替代:

    string str = R"(Line 1
    Line 2 with \t)";
    

    这也说明,使用原始字符串字面量时,\t转义字符没有替换为实际的制表符字符,而是按照字面形式保存。将str写入控制台得到的输出如下所示:
    Line 1
    Line 2 with \t
    因为原始字符串字面量以)“结尾,所以使用这个语法时,不能在字符串中嵌入)”。例如,下面的 字符串是不合法的,因为在这个字符串中间包含了一个)”:

    string str = R"(The characters )"n are embedded in this string)" // Error!
    

    如果需要嵌入)",则需要使用扩展的原始字符串字面量语法,如下所示:

    R"d-char-sequence(r-char-sequence)d-char-sequence"
    

    r-char-sequence是实际的原始字符串。d-char-sequence是可选的分隔符序列,原始字符串首尾的分隔符序列应该一致。分隔符序列最多能有16个字符。应选择未出现在原始字符串字面量中的序列作为分隔符序列。上面的例子可以改用唯一的分隔符序列:

    string str = R"-(The characters )" are embedded in this string)-";
    

    在操作数据库查询字符串和正则表达式等字符串时,原始字符串字面量可以令程序的编写更加方便。

    展开全文
  • C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆内存对象 ) C / C++ 字符串 完整代码示例



    C++ 字符串 对象


    C++ 字符串 :

    • 1.string 类 : C++ 中的字符串是 string 类 对象 ;
    • 2.string 类定义位置 : 该 string 类定义在 iostream 头文件中 , 不必引入另外的头文件 ;
    #include <iostream>
    



    C++ 字符串 对象 创建方法


    C++ 字符串 对象 创建方法 :

    • 1.直接赋值 : 直接使用 C 字符串赋值 ;
    	//① 使用字符串赋值
    	string string_c_plus_1 = " Hello ";
    
    • 2.构造方法 : 调用 string 构造方法 创建 string 对象 ;
      • ① 传入 string 参数 : string 构造方法可以传入 string 对象 ;
      • ② 传入 C 字符串参数 : string 构造方法也可以传入 一个 C 字符串 ;
    	//② 调用构造方法 初始化字符串
    	string string_c_plus_2(string_c_plus_1);
    	string string_c_plus_3(" World ");
    
    • 3.使用 new 分配内存 : 使用 new 为 String 对象分配一块堆内存空间 , 返回 string * 类型的指针 ;
    	//③ 使用 new 申请的内存 , 需要使用 delete 释放
    	string *string_c_plus_4 = new string(" New ");
    	delete string_c_plus_4;
    

    调用该 string* 对象的方法需要使用 -> 进行调用 ;

    堆内存使用原则 :
    ① 使用 new 申请的内存 , 需要使用 delete 释放 ;
    ② 使用 new [] 申请的数组 , 需要使用 delete[] 释放 ;
    ③ 使用 malloc 申请的内存 , 需要使用 free 释放 ;




    C++ 字符串 对象 输出到控制台


    C++ 字符串 对象 输出到控制台 :

    • 1.不能直接使用 cout 输出 : 下面的用法是错误的 ; 使用 cout 不能直接将 string 对象输出 ;
    	//这种用法是错误的
    	string string_c_plus_1 = " Hello ";
    	cout << string_c_plus_1 << endl;
    
    • 2.输出方法 : 需要将 string 对象转成 C 字符串 , 然后再输出 :
    	//调用 string 对象的 c_str() 方法 , 获取其 C 字符串 , 然后再输出到控制台
    	string string_c_plus_1 = " Hello ";
    	cout << string_c_plus_2.c_str() << endl;
    

    在 Java 中输出 String 对象 , 默认会调用其 toString 方法 , 但是在 C 中不可以直接使用 ;




    C++ 字符串 拼接


    C++ 字符串拼接 :

    • 1.使用 “+” 符号拼接 : 这里的加号进行了操作符重载 , 字符串之间相加代表了字符串的拼接操作 ;
    	//① "+" : 操作符重载 , 重新定义了 加号运算符的行为 , 
    	//		这里加号可以实现字符串拼接 , 与 Java 类似
    	string string_c_plus_5 = string_c_plus_1 + string_c_plus_3;
    
    • 2.调用 string 对象的 append 方法 : 调用 string 对象的 append() 方法 , 传入要拼接的字符串 ;
    	//② 调用 string 对象的 append 方法 , 拼接字符串
    	string string_c_plus_6 = string_c_plus_1.append( string_c_plus_3 );
    
    • 3.代码示例 :
    	//C++ 字符串拼接
    	//① "+" : 操作符重载 , 重新定义了 加号运算符的行为 , 这里加号可以实现字符串拼接 , 与 Java 类似
    	//② 调用 string 对象的 append 方法 , 拼接字符串
    	string string_c_plus_5 = string_c_plus_1 + string_c_plus_3;
    	string string_c_plus_6 = string_c_plus_1.append( string_c_plus_3 );
    
    • 4.运行结果 :
     Hello  World
     Hello  World
    

    在这里插入图片描述

    操作符重载 : 重新定义了操作符的作用 , 这里的 “+” 就是重新定义了其作用 , 拼接字符串 ;




    C++ 字符串 方法调用 ( 栈内存对象 )


    C++ 字符串 方法调用 : 该字符串 ( string ) 对象 在栈内存中 ;

    • 1.获取字符串长度 : 调用 string 对象的 size() 方法 , 即可返回字符串长度 ;
    	//① 使用字符串赋值
    	string string_c_plus_1 = " Hello ";
    	//获取 C++ 字符串长度 : 调用 string 对象的 size() 方法 , 获取字符串长度
    	int string_c_plus_1_size = string_c_plus_1.size();
    
    • 2.判断字符串是否为空 : 调用 string 对象的 empty() 方法 , 判断字符串是否为空 ;
    	//① 使用字符串赋值
    	string string_c_plus_1 = " Hello ";
    	//判断 C++ 字符串是否为空 : 调用 string 对象的 empty() 方法 ; 
    	bool string_c_plus_1_empty = string_c_plus_1.empty();
    
    • 3.代码示例 :
    	//使用字符串赋值
    	string string_c_plus_1 = " Hello ";
    	
    	//获取 C++ 字符串长度 : 调用 string 对象的 size() 方法 , 获取字符串长度
    	int string_c_plus_1_size = string_c_plus_1.size();
    	cout << "string_c_plus_1_size : " << string_c_plus_1_size << endl;
    
    	//判断 C++ 字符串是否为空 : 调用 string 对象的 empty() 方法 ; 
    	bool string_c_plus_1_empty = string_c_plus_1.empty();
    	cout << "string_c_plus_1_empty : " << string_c_plus_1_empty << endl;
    
    • 4.运行结果 :
    string_c_plus_1_size : 14
    string_c_plus_1_empty : 0
    

    在这里插入图片描述

    使用 “.” 方式调用栈内存对象的方法 ;




    C++ 字符串 方法调用 ( 堆内存对象 )


    C++ 字符串 堆内存对象 方法调用 :

    • 1.堆内存对象创建 : 使用 new 创建的 string 对象 需要在堆内存中为其分配内存 , 返回的是 string* 指针类型 ;
    	//使用 new 创建的对象 , 就不能使用 . 访问其方法和变量 , 需要使用 -> 符号进行访问 
    	// -> 相当于 (*). 运算, 先读取指针内容 , 然后访问其方法或变量
    
    	string* string_c_plus_7 = new string(" New String ");
    
    • 1.获取字符串长度 : 调用 string 对象的 size() 方法 , 即可返回字符串长度 ; 需要使用 -> 代替 . 操作 ;
    	//① 获取字符串长度 : 
    	int string_c_plus_7_size = string_c_plus_7->size();
    
    • 2.判断字符串是否为空 : 调用 string 对象的 empty() 方法 , 判断字符串是否为空 ; 需要使用 -> 代替 . 操作 ;
    	//② 判断字符串是否为空 : 
    	bool string_c_plus_7_empty = string_c_plus_7->empty();
    
    • 3.使用指针的好处 :
      • ① 扩大作用域 : 如果在栈内存中使用 , 有作用域限制 , 出了栈内存 作用域 , 该对象就无效了 ;
      • ② 方便参数传递 : 指针 大小为 4 ( 32 位系统 ) 或 8 ( 64 位系统 ) 个字节 , 其当做参数传递 比直接传递对象 ( 动辄几十上百字节甚至更高 ) 效率更高 ;
    • 4.代码示例 :
    	//使用 new 创建的对象 , 就不能使用 . 访问其方法和变量 , 需要使用 -> 符号进行访问 
    	// -> 相当于 (*). 运算, 先读取指针内容 , 然后访问其方法或变量
    
    	string* string_c_plus_7 = new string(" New String ");
    	
    	//① 获取字符串长度 : 
    	int string_c_plus_7_size = string_c_plus_7->size();
    	cout << "string_c_plus_7 : " << string_c_plus_7_size << endl;
    
    	//② 判断字符串是否为空 : 
    	bool string_c_plus_7_empty = string_c_plus_7->empty();
    	cout << "string_c_plus_7_empty : " << string_c_plus_7_empty << endl;
    
    	//释放堆内存
    	delete string_c_plus_7;
    
    	//使用指针的好处 : 
    	// ① 如果在栈内存中使用 , 有作用域限制 , 出了栈内存 作用域 , 该对象就无效了 ; 
    	// ② 指针 大小为 4 ( 32 位系统 ) 或 8 ( 64 位系统 ) 个字节 , 
    	//	  其当做参数传递 比直接传递对象 ( 动辄几十上百字节甚至更高 ) 效率更高 
    
    • 5.运行结果 :
    string_c_plus_7 : 12
    string_c_plus_7_empty : 0
    

    在这里插入图片描述




    C / C++ 字符串 完整代码示例


    // 001_CMake_1.cpp: 定义应用程序的入口点。
    //
    
    #include "001_CMake_1.h"
    #include "c_extern.h"
    
    using namespace std;
    
    //定义方法接收 int& 引用类型变量
    //并在方法中修改该变量的值
    void quote(int& b) {
    	b = 888;
    }
    
    int main()
    {
    	cout << "Hello CMake。" << endl;
    
    	//1. C C++ 兼容
    	//博客地址 : https://hanshuliang.blog.csdn.net/article/details/98840708
    	//调用 c_extern.h 头文件中定义的方法
    	//该方法定义在了 C 语言文件中
    	add(1, 2);
    
    
    	//2. 引用数据类型
    	//博客地址 : https://hanshuliang.blog.csdn.net/article/details/99239635
    	//代码 展示 流程 : 
    	//① 定义 普通 类型 变量
    	int a = 8;
    	//② 定义 引用类型变量, 格式 : 类型名称& 变量名 = 对应类型变量名称 ;
    	int& b = a;
    	//③ 调用函数传入引用类型参数 : 将引用类型传给接收引用类型的方法
    	quote(b);
    	//④ 打印引用数据类型的修改结果 , 结果是 b 被修改成了 888
    	cout << b << endl;
    
    	//引用数据类型定义与使用 : 
    	// ① 引用数据类型定义 : 类型名称& 变量名 = 对应类型变量名称 ;
    	// ② 引用数据类型的使用方法 : 直接当做原来的变量使用即可, 可以替换原来变量的位置使用
    
    	//引用类型解析 : 
    	// ① int& 是引用数据类型 , b 是 a 的引用 
    	// ② 分配一块内存存放 int 类型数据 8 , 将该内存赋予一个别名 a
    	// ③ 同时又给该内存赋予另外一个别名 b 
    
    
    	//3. 字符串使用
    	//C 字符串 表示方法 : 
    	// ① 字符数组 : 本质是 字符 数组 char[] , 这里注意字符数组要以 NULL 或 '\0' 结尾; 
    	char string_c[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
    	// ② 指针 : 使用指针形式表示字符串 , 默认末尾增加 '\0' ;
    	char* string_c_p = "hello";
    
    	//字符串打印 : 
    	// ① 打印字符串 , cout 后的 << 后可以打印 字符串 , 也可以打印变量
    	// ② 输出 cout << 字符串或变量1 << 字符串或变量2 ... << endl 可以拼接 输出信息
    	cout << "string_c : " << string_c << endl;
    	cout << "string_c_p : " << string_c_p << endl;
    
    	//C 语言中的字符串操作
    	//拷贝字符串 
    	char string_c_copy_destination[6];
    	char string_c_copy_source[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
    	// ① 参数 : strcpy 方法是拷贝字符串的方法 , 第一个参数是目标字符串 , 第二个参数是源字符串
    	// ② 作用 : 该方法是将 源字符串 拷贝到 目标字符串中
    	strcpy(string_c_copy_destination, string_c_copy_source);
    	// ③ 打印拷贝结果 : 
    	cout << "string_c_copy_destination : " << string_c_copy_destination << endl;
    
    	//拼接字符串 
    	//① 定义目标字符串 : 拼接字符串的目标字符串的大小一定要大于等于要拼接的两个字符串大小之和, 否则会报错
    	char string_c_cat_destination[30] = " cat dst ";
    	char string_c_cat_source[] = " cat src ";
    	//② 拼接字符串方法参数 : 第一个参数是目标字符串 , 第二个参数是源字符串
    	//③ 目标字符串大小 : 注意 目标字符串的 大小一定要大于 两个字符串实际大小
    	strcat(string_c_cat_destination, string_c_cat_source);
    	//④ 打印字符串拼接结果 : 
    	cout << "string_c_cat_destination : " << string_c_cat_destination << endl;
    
    
    	//获取字符串长度
    	//① 参数 : 传入要获取的字符串 , 该长度不含 '\0' 结尾标志
    	//② 作用 : 获取实际的字符串长度 , 即自动识别 '\0' 位置 , 获取其长度 , 与所占用的内存大小无关
    	char string_c_len[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
    	char string_c_len2[20] = { 'h', 'e', 'l', 'l', 'o', '\0' };
    	char * string_c_len3 = "hello";
    	
    	//① 字符数组长度 , 测量从开始到 '\0' 的长度, 不包括 '\0'
    	int len1 = strlen(string_c_len);
    	//② 指定大小的字符数组长度 , 结果不是指定的大小的值 , 获取的是实际字符串长度
    	int len2 = strlen(string_c_len2);
    	//③ 指针表示的字符串 , 其获取的大小是实际字符串大小, 不包含自动添加的 '\0' 
    	int len3 = strlen(string_c_len3);
    	//④ 打印 三个字符串大小
    	cout << "len1 : " << len1
    		<< " len2 : " << len2
    		<< " len3 : " << len3
    		<< endl;
    
    
    	//字符串比较
    	// ① 参数说明 : 参数是需要比较的两个字符串 , 第一个参数 str1 , 第二个参数 str2
    	// ② 对比规则 : str1 和 str2 两个字符串 , 从左到右 逐个对比 ASCII 码 大小 ; 
    	//		a. 如果 str1 等于 str2 , 返回 0; 
    	//		b. 如果 str1 > str2 , 返回值 大于 0 ;
    	//		c. 如果 str1 < str2 , 返回值 小于 0 ;
    
    	//定义需要比较的字符串
    	char* string_c_comp_1 = "Hello";
    	char* string_c_comp_2 = "Hello";
    	char* string_c_comp_3 = "hello";
    
    	// ① 两个字符串相等
    	int cmp_result_1_2 = strcmp(string_c_comp_1, string_c_comp_2);
    	// ② "Hello" 字符串 (H 对应 ASCII 72) 小于 "hello" 字符串 (h 对应 ASCII 104) , 返回值 小于 0
    	int cmp_result_1_3 = strcmp(string_c_comp_1, string_c_comp_3);
    	// ③ "hello" 字符串 (h 对应 ASCII 104) 大于 "Hello" 字符串 (H 对应 ASCII 72) , 返回值 大于 0
    	int cmp_result_3_1 = strcmp(string_c_comp_3, string_c_comp_1);
    
    	//输出字符串对比结果
    	cout << "cmp_result_1_2 : " << cmp_result_1_2 
    		<< " cmp_result_1_3 : " << cmp_result_1_3
    		<< " cmp_result_3_1 : " << cmp_result_3_1
    		<< endl;
    
    
    	// C++ string 类 : 该类定义在 iostream 头文件中
    	//创建 string 类型对象有三种方法 : 
    	//① 直接使用字符串赋值 
    	//② 调用构造方法赋值 
    	//③ 最后可以调用 new 为字符串分配一块内存
    
    	//① 使用字符串赋值
    	string string_c_plus_1 = " Hello ";
    
    	//② 调用构造方法 初始化字符串
    	string string_c_plus_2(string_c_plus_1);
    	string string_c_plus_3(" World ");
    
    	//上面的三种字符串不需要释放 , 因为其定义在栈内存中 , 下面使用 new 创建字符串的情况需要 delete 释放内存 ; 
    
    	//③ 使用 new 申请的内存 , 需要使用 delete 释放
    	string *string_c_plus_4 = new string(" New ");
    	delete string_c_plus_4;
    
    	//使用 new [] 申请的数组 , 需要使用 delete[] 释放
    	//使用 malloc 申请的内存 , 需要使用 free 释放
    
    	//C++ 字符串输出
    	//字符串对象不能直接在 cout 中输出, cout << string string_c_plus_5 << endl; 是错误的
    	//cout << string_c_plus_2 << endl;
    	//要将 string 对象打印到控制台上, 需要将其转为 C 字符串 , char* 或 char[] 才能输出
    	cout << string_c_plus_1.c_str() << endl;
    
    
    	//C++ 字符串拼接
    	//① "+" : 操作符重载 , 重新定义了 加号运算符的行为 , 这里加号可以实现字符串拼接 , 与 Java 类似
    	//② 调用 string 对象的 append 方法 , 拼接字符串
    	string string_c_plus_5 = string_c_plus_1 + string_c_plus_3;
    	string string_c_plus_6 = string_c_plus_1.append( string_c_plus_3 );
    
    	//输出拼接的字符串
    	cout << string_c_plus_5.c_str() << endl;
    	cout << string_c_plus_6.c_str() << endl;
    	
    
    
    	//获取 C++ 字符串长度 : 调用 string 对象的 size() 方法 , 获取字符串长度
    	int string_c_plus_1_size = string_c_plus_1.size();
    	cout << "string_c_plus_1_size : " << string_c_plus_1_size << endl;
    
    	//判断 C++ 字符串是否为空 : 调用 string 对象的 empty() 方法 ; 
    	bool string_c_plus_1_empty = string_c_plus_1.empty();
    	cout << "string_c_plus_1_empty : " << string_c_plus_1_empty << endl;
    
    	//使用 new 创建的对象 , 就不能使用 . 访问其方法和变量 , 需要使用 -> 符号进行访问 
    	// -> 相当于 (*). 运算, 先读取指针内容 , 然后访问其方法或变量
    
    	string* string_c_plus_7 = new string(" New String ");
    	
    	//① 获取字符串长度 : 
    	int string_c_plus_7_size = string_c_plus_7->size();
    	cout << "string_c_plus_7 : " << string_c_plus_7_size << endl;
    
    	//② 判断字符串是否为空 : 
    	bool string_c_plus_7_empty = string_c_plus_7->empty();
    	cout << "string_c_plus_7_empty : " << string_c_plus_7_empty << endl;
    
    	//释放堆内存
    	delete string_c_plus_7;
    
    	//使用指针的好处 : 
    	// ① 如果在栈内存中使用 , 有作用域限制 , 出了栈内存 作用域 , 该对象就无效了 ; 
    	// ② 指针 大小为 4 ( 32 位系统 ) 或 8 ( 64 位系统 ) 个字节 , 
    	//	  其当做参数传递 比直接传递对象 ( 动辄几十上百字节甚至更高 ) 效率更高 
    
    
    
    
    
    	return 0;
    }
    

    展开全文
  • C++字符串数组 | 字符串数组输出

    千次阅读 2020-12-12 22:12:52
    C++字符串数组定义 在C++中不仅可以用string定义字符串变量,也可以用string定义字符串数组。 string array[3]; 表示定义一个字符串数组,这个数组包含3个字符串元素。 C++字符串数组初始化 string array[3]={{"li...

    C++字符串数组定义

    在C++中不仅可以用string定义字符串变量,也可以用string定义字符串数组。

    string array[3];
    

    表示定义一个字符串数组,这个数组包含3个字符串元素。

    C++字符串数组初始化

    string array[3]={{"li"},{"zhang"},{"wang"}}
    

    读者在使用字符串数组时应该注意以下几点:

    在一个字符串数组中包含若干个元素,每个元素相当于一个字符串变量。

    并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。

    在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组 的区别。

    如果用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。

    每一个字符串元素中只包含字符串本身的字符,而不包括\0,用字符串数组存放字符串以及对字符串进行处理是很方便的。

    在C++中定义字符串数组时,编译系统为每一个字符串变量分配4个字节,在存储单元中,并不是直接存放字符串本身,而是存放字符串的地址。

    经典案例:C++实现用字符串数组输出。

    #include<iostream>//预处理
    #include<string> //引入string 
    using namespace std;//命名空间 
    int main()//主函数 
    {
      string array[3]={{"zhangsan"},{"lisi"},{"wangwu"}};//定义字符串数组 
      for(int i=0;i<3;i++)//for循环 
      {
        cout<<array[i]<<endl;//挨个输出字符串变量的值 
      }
      return 0; //函数返回值为0;
    }
    

    执行本程序之后,会输出:

    zhangsan
    lisi
    wangwu
    
    --------------------------------
    Process exited after 1.425 seconds with return value 0
    请按任意键继续. . .
    

    C++字符串数组输出

    更多案例可以go公众号:C语言入门到精通

    展开全文
  • C++ 字符串与字符数组 详解

    万次阅读 多人点赞 2018-03-03 19:28:22
    C++中,有两种类型的字符串表示形式: C-风格字符串 C++引入的string类 C-风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。...
  • C++字符串常见操作函数最全总结!!

    万次阅读 多人点赞 2020-05-16 22:36:50
    在做题过程中经常用到字符串,有时候费了很大力气去写一个函数,结果最后发现C++已经封装好了此类函数。。。所以花点时间总结一下,这里参考了:http://www.cplusplus.com/reference/ 1、构造函数: string str:空串...
  • C字符串与C++字符串基本用法

    千次阅读 2018-12-30 10:46:49
    C字符串与C++字符串基本用法 1. 字符数组与字符串区别 C++中,字符数组和字符串都是通过char关键字来定义的,但二者不同,显著的区别就是字符串的长度是字符数目加1,因为包含了\0结束符,而字符数组的长度就是...
  • C++字符串和C字符串的转换

    千次阅读 2019-05-02 14:48:46
    C++提供的由C++字符串转换成对应的C字符串的方法是使用data()、c_str()和copy()来实现。 data():以字符数组的形式返回字符串的内容,但并不添加'\0' c_str():返回一个以'\0'结尾的字符数组 copy():把字符串的...
  • C++字符串数组

    万次阅读 多人点赞 2019-05-30 22:43:54
    C++提供了一种新的数据类型——字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量——用一个名字代表一个字符序列。 实际上,string并不是C++语言本身具有的基本类型,它...
  • C字符串和C++字符串的区别

    千次阅读 2016-05-10 14:03:32
    C字符串和C++字符串  在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。需要注意的是:只有以null字符结尾...
  • C++字符串比较大小的两种方法

    万次阅读 2017-05-08 12:55:25
    c++字符串比较大小的两种方法 一、.compare函数的使用
  • 在C语言中,应用字符串需要定义字符数组,字符串需要存放在字符数组中。然后利用各种字符串操作函数对其操作。 http://blog.csdn.net/chaipp0607/article/details/56676791但是这种方式存在一些弊端,比如字符数组...
  • C/C++字符串和数字的相互转换

    千次阅读 2019-11-15 21:31:30
    平时有可能会用到将int的1转换为string的"1"的题型,下面对C/C++字符串和数字的相互转换进行整理: int、long 和 double 等类型,有时也需要转换为字符串形式,这样结果字符串才能立即输出到文件或其他输入输出设备...
  • 获取C/C++字符串、字符数组长度

    万次阅读 多人点赞 2018-03-26 21:18:24
    在C/C++中常用的获取字符串长度或者字符串数组长度的函数有 sizeof() length() strlen() size() 其中strlen(str)和str.length()和str.size()都可以用来求字符串的长度 str.length()和str.size()是用于求...
  • C++ 字符串操作函数

    千次阅读 2017-02-23 17:28:58
    由于字符串使用广泛,C和C++提供了一些字符串函数,包括字符串连接函数strcat,字符串复制函数strcpy,字符串比较函数strcmp,字符串长度函数strlen,在C语言中被定义在string.h中定义。在C++中被定义在cstring和...
  • C++字符串查找和替换

    千次阅读 2017-02-08 20:32:08
    C++字符串查找和替换
  • C/C++字符串string操作的全面总结

    万次阅读 多人点赞 2020-10-26 15:38:48
    字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。总结一下构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的...
  • C++ 字符串加空格

    千次阅读 2019-05-12 17:19:00
    给定一个字符串,在字符串的每个字符之间都加一个空格。 输出修改后的新字符串。 输入格式 共一行,包含一个字符串。 输出格式 输出增加空格后的字符串。 数据范围 1≤字符串长度≤1001≤字符串长度≤100 ...
  • c++字符串替换

    千次阅读 2018-08-16 19:35:40
    C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事。 string&amp; replace_all_distinct 用新字符串替换所有旧...
  • C/C++字符串或数字数组简单排序

    千次阅读 2020-06-10 11:38:46
    C/C++字符串或数字数组简单排序 #include <stdio.h> #include <algorithm> #include <iostream> using namespace std; int main() { int a[10] = { 8,9,6,9,8,6,3,4,7,8 }; char c[10] = ...
  • 【C++】C++字符串和数字的拼接

    千次阅读 2019-11-27 11:21:18
    如果你使用过python,你会发现字符串和int/float/double便捷的拼接方式;但如果你使用C++,可能你每次需要的时候搜索一下才能知道。本文提供两种简单的方式来完成这个功能。 std::to_string() 通过std::to_string()...
  • C++字符串处理总结(char、string)

    万次阅读 多人点赞 2018-09-09 14:59:33
    0. 写在最前面 希望大家收藏: ... 也欢迎收藏我的另一篇总结:编程常用数据结构与函数...C++字符串处理有最原始的char以及string两种方式,这里对两种方式常用的功能进行总结及对比。 如果觉得还不错就点个赞,...
  • C++字符串中查找子字符串

    千次阅读 2018-04-20 14:43:42
    C++的string类提供了字符串中查找另一个字符串的函数find。其重载形式为:string::size_type string::find(string &amp;);功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置...
  • C/C++ 字符串拼接 sprintf()

    千次阅读 2018-10-09 16:11:13
    C/C++ 字符串拼接 sprintf() 利用opencv 按时间命名图片并保存到E盘指定位置,用到字符串拼接知识,找了一些资源,拼凑一下,试了试,还不错,特此记录、分享。 (注)opencv图片保存算是小儿科,代码不再贴出,...
  • C++ 字符串替换

    千次阅读 2015-08-24 16:18:44
    C++实现字符串的分割和替换,作为平时代码库的储备,仅供各位猿友参考.
  • C++字符串和字符串结束标志

    千次阅读 2017-08-03 10:52:59
    用一个字符数组可以存放一个字符串中的字符。如: char str[12]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’}; 用一维字符数组str来存放一个字符串″I am happy″中的字符。字符串的实际...
  • C++ 字符串】替换字符串中的字符

    千次阅读 2019-04-07 09:31:36
    仅供本人学习记录 Description Write a program to input several strings from the keyboard and replace ...输入有多行,第一行输入一个整数N,后面N行每行输入一个字符串,以‘#’为定界符表示字符串结束 Outpu...
  • C++字符串分割

    千次阅读 2018-11-04 12:22:23
    然而在学习C++之后,发现string类中没有strtok这个成员函数了,但有6个字符串搜索函数,这样可以利用搜索函数完成字符串分割。 string搜索操作: 函数名 解释 s.find(args) 查找s中第一次出现...
  • c++ 字符串相等比较

    千次阅读 2020-05-06 14:29:04
    比较两个char*字符串 或 string对象是否相等 c\c++ 1. 如果要比较的对象是char*字符串 利用: int strcmp(const char* s1,const char* s2); (1) 当s1 < s2时,返回负数; (2) 当s1 == s2时,返回值 = 0; (3) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 571,932
精华内容 228,772
关键字:

c++字符串

c++ 订阅