C++---string与字符数组之间的相互转换

相互转换

在C++中,可以使用以下方法将std::string与字符数组进行相互转换:

  1. std::string转换为字符数组:

    • 使用c_str()方法:返回一个指向以null结尾的字符数组的指针。
    • 使用data()方法:返回一个指向字符数组的指针,但不保证以null结尾。
    • 使用copy()方法:将std::string的内容复制到字符数组中。
  2. 将字符数组转换为std::string

    • 使用字符数组作为std::string的构造函数的参数。
    • 使用assign()方法:将字符数组的内容赋值给std::string
    • 使用append()方法:将字符数组的内容追加到std::string的末尾。

示例代码:

#include <iostream>
#include <string>

int main() {
    // std::string 转换为字符数组
    std::string str = "Hello, world!";
    
    // 方法一:使用 c_str() 方法
    const char* charArray1 = str.c_str();
    std::cout << "Using c_str(): " << charArray1 << std::endl;
    
    // 方法二:使用 data() 方法
    const char* charArray2 = str.data();
    std::cout << "Using data(): " << charArray2 << std::endl;

    // 方法三:使用 copy() 方法
    char charArray3[20]; // 假设字符数组大小为 20
    str.copy(charArray3, sizeof(charArray3));
    charArray3[str.size()] = '\0'; // 添加 null 结尾
    std::cout << "Using copy(): " << charArray3 << std::endl;

    // 字符数组转换为 std::string
    const char* charArray = "Hello, C++!";
    
    // 方法一:使用构造函数
    std::string str1(charArray);
    std::cout << "Using constructor: " << str1 << std::endl;

    // 方法二:使用 assign() 方法
    std::string str2;
    str2.assign(charArray);
    std::cout << "Using assign(): " << str2 << std::endl;

    // 方法三:使用 append() 方法
    std::string str3;
    str3.append(charArray);
    std::cout << "Using append(): " << str3 << std::endl;

    return 0;
}

要求字符串数组的长度,需要注意字符串数组的定义方式。如果字符串数组是以C风格的字符串(以null结尾的字符数组)为元素的话,可以使用strlen()函数来计算每个字符串的长度,然后遍历数组并累加每个字符串的长度。

求其长度

要求字符串的长度,可以使用C++标准库中的std::string类提供的length()或者size()方法来获取字符串的长度。另外,如果是以C风格的字符串(以null结尾的字符数组)表示的字符串,可以使用C标准库中的strlen()函数来获取字符串的长度。

示例代码:

#include <iostream>
#include <string>
#include <cstring> // 包含 strlen 函数的头文件

int main() {
    // 使用 std::string 类型的字符串
    std::string str1 = "Hello, world!";
    std::cout << "Length of str1: " << str1.length() << std::endl;
    // 或者使用 size() 方法
    std::cout << "Size of str1: " << str1.size() << std::endl;

    // 使用 C 风格的字符串
    const char* str2 = "Hello, world!";
    std::cout << "Length of str2: " << strlen(str2) << std::endl;

    return 0;
}

在这个示例中,str1是使用std::string类定义的字符串,可以直接使用length()或者size()方法来获取字符串的长度。而str2是以C风格的字符串表示的,我们使用strlen()函数来获取其长度。

力扣2810(故障键盘)

在你提供的代码中,你似乎试图实现一个功能,即将给定字符串中的字符'i'与其前面的字符进行逆序。然而,你的代码存在一些问题:

  1. 在C++中,数组的大小必须是常量表达式,而不是变量。因此,你不能使用变量 length 来声明数组 tempCharArray 的大小。你可以使用动态分配的方式来解决这个问题。
  2. 在字符串中查找字符 'i' 后,你尝试将它与其前面的字符进行逆序交换,但你的交换逻辑似乎有误。你应该交换 tempCharArray[i]tempCharArray[i-j],而不是 tempCharArray[i]tempCharArray[i]
  3. tempCharArray 数组中未被初始化的元素会包含未定义的值,因此你需要确保在使用之前对它进行初始化。

下面是对你的代码的一些修改:

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

class Solution {
public:
    string finalString(string s) {
        const char* charArray = s.c_str();
        int length = s.length(); // 使用字符串长度获取长度
        char* tempCharArray = new char[length + 1]; // 动态分配数组大小,并添加一个额外的空间来存储字符串的结尾字符 '\0'

        for (int i = 0; i < length; i++) {
            if (charArray[i] != 'i') {
                tempCharArray[i] = charArray[i];
            } else {
                // 从前往后找到字符 'i',然后与前面的字符逆序交换
                for (int j = 0; j <= i / 2; j++) {
                    char temp = tempCharArray[i - j]; // 交换 tempCharArray[i] 和 tempCharArray[i-j]
                    tempCharArray[i - j] = tempCharArray[j];
                    tempCharArray[j] = temp;
                }
            }
        }
        tempCharArray[length] = '\0'; // 在末尾添加字符串的结尾字符 '\0',以确保字符串正确终止

        string s1(tempCharArray);
        delete[] tempCharArray; // 释放动态分配的数组
        return s1;
    }
};

int main() {
    Solution solution;
    string input = "Hello, this is an example.";
    string result = solution.finalString(input);
    cout << result << endl; // 输出结果
    return 0;
}

以上代码将给定字符串中的字符 'i' 与其前面的字符进行逆序,并返回逆序后的字符串。

示例代码

class Solution {
public:
	string finalString(string s) {
		const char* charArray=s.c_str();
		cout<<charArray<<endl;
		cout<<s<<endl;
		int length=strlen(charArray);
		 //int length1=s.length();
		 //cout<<length;
		 //cout<<length1;
		char* tempCharArray = new char[length + 1]; 
		// 动态分配数组大小,并添加一个额外的空间来存储字符串的结尾字符 '\0' 
		int count=0;
		for(int i=0;i<length;i++)
		{
			if(charArray[i]!='i')
			{
				tempCharArray[count++]=charArray[i];
			}
			else
			{
				for(int j=0;j<count/2;j++)
				{
					char temp=tempCharArray[count-1-j];
					tempCharArray[count-1-j]=tempCharArray[j];
					tempCharArray[j]=temp;
				}
			}
		}
		tempCharArray[count] = '\0'; // 在末尾添加字符串的结尾字符 '\0',以确保字符串正确终止
		string s1(tempCharArray);
		delete[] tempCharArray; // 释放动态分配的数组
		return s1;
	}

};



// class Solution {
// public:
//     string finalString(string s) {
//         string ans="";
//         for(int i=0;i<s.length();i++){
//             if(s[i]=='i'){
//                 reverse(ans.begin(),ans.end());
//             }else{
//                 ans+=s[i];
//             }
//         }
//         return ans;

//     }
// };


  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frank---7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值