C++ 面试题(字符串操作)

<1.字符串拷贝>
思路分析:
a. 确定被拷贝的数组的内存大小是否小于等于目标数组的内存大小;
b. 拷贝数组;
c. 目标数组最后一个字符为空字符(‘\0’)。

//str1:被拷贝的数组 str2:目标数组 len:目标数组的长度
bool stringCopy(char* str1,char* str2,int len)
{
    int i = 0;
    while (str1[i]!='\0')
    {
        i++;
    }
    if (i>len)
    {
        return false;
    }
    i = 0;
    while (str1[i]!='\0')
    {
        str2[i] = str1[i];
        i++;
    }
    str2[i] = '\0';
    return true;
}

void printF(char* str1,char* str2)
{
    cout <<"str1:"<< str1 << endl;
    cout <<"str2:"<< str2 << endl;
}

int main()
{
    char str1[] = "abc";
    char str2[10] = {0};
    //----拷贝
    stringCopy(str1, str2, 10);
    printF(str1, str2);
    return 0;
}

<2.字符串连接>

  1. 将str1与str2连接—->(将合成的字符串放入str1中)
    思路分析:
    a. 确定str1的内存大小是否小于str1+str2-1;
    b. 连接;
    c. 连接后的字符串最后一个为空字符(‘\0’)。
//str1-->存放最终连接字符串的数组 ,len--->str1的内存大小
bool stringConnection(char* str1,int len,char* str2)
{
    int i = 0;
    int k = 0;
    while (str1[i]!='\0')
    {
        i++;
    }
    while (str2[k] != '\0')
    {
        k++;
    }
    if (len<i+k-1)
    {
        return false;
    }
    //连接
    k = 0;
    while (str2[k] != '\0')
    {
        str1[i] = str2[k];
        i++;
        k++;
    }
    str1[i] = '\0';
    return true;
}

void printF(char* str1,char* str2)
{
    cout <<"str1:"<< str1 << endl;
    cout <<"str2:"<< str2 << endl;
}

int main()
{
    char str1[20] = "abc";
    char str2[10] = "def";
    stringConnection(str1, 20, str2);
    printF(str1, str2);
    return 0;
}
  1. 将str1与str2连接放入到str3中
    思路分析:
    a. 确定str3的大小是否小于str1+str2-1;
    b. 放入到str3中—–>(每个字符串一次放入);
    c. str3最后一个字符为空字符(‘\0’)。
//target:目标数组 len: 目标数组的长度
bool stringConnection(char* str1, char* str2, char* target,int len)
{
    int i = 0;
    int k = 0;
    while (str1[i] != '\0')
    {
        i++;
    }
    while (str2[k] != '\0')
    {
        k++;
    }
    if (len<i + k - 1)
    {
        return false;
    }
    //连接放入
    i = 0, k = 0;
    while (str1[i] != '\0')
    {
        target[i] = str1[i];
        i++;
    }
    while (str2[k] != '\0')
    {
        target[i] = str2[k];
        i++;
        k++;
    }
    //最后一个字符为空字符
    target[i] = '\0';
    return true;
}

void printF(char* str1,char* str2)
{
    cout <<"str1:"<< str1 << endl;
    cout <<"str2:"<< str2 << endl;
}

void printFP(char* str1, char* str2,char* str3)
{
    cout << "str1:" << str1 << endl;
    cout << "str2:" << str2 << endl;
    cout << "str3:" << str3 << endl;
}

int main()
{
    char str1[10] = "abc";
    char str2[10] = "def";
    char str3[20] = {0};
    stringConnection(str1,str2, str3, 20);
    printFP(str1, str2,str3);
    return 0;
}

<3.字符串大小写转换>
(大写转小写)思路分析:
a. 遍历不是空字符的字符, 将其中的大写字母转换为小写字母;

//--true:表示转换成功 false:表示转换失败
//A:65 Z:90
bool stringCase(char* str1,char* str2,int len )
{
    int i = 0;
    while (str1[i] != '\0')
    {
        i++;
    }
    if (i>len)
    {
        return false;
    }
    i = 0;
    while (str1[i]!='\0')
    {
        if (str1[i]>='A'&&str1[i]<='Z')
        {
            str2[i] = str1[i] + 32;
        }
        else
        {
            str2[i] = str1[i];
        }
        i++;
    }
    str2[i] = '\0';
    return true;
}

void printF(char* str1,char* str2)
{
    cout <<"str1:"<< str1 << endl;
    cout <<"str2:"<< str2 << endl;
}

void printFP(char* str1, char* str2,char* str3)
{
    cout << "str1:" << str1 << endl;
    cout << "str2:" << str2 << endl;
    cout << "str3:" << str3 << endl;
}

int main()
{
    char str1[10] = "aBC";
    char str2[10] = {0};
    stringCase(str1, str2, 10);
    printF(str1, str2);
    return 0;
}

注意: 小写转大写就是字符-32;

我们还可以用二进制的方法来大小写转换:

bool stringBinaryCase(char* str1, char* str2, int len)
{
    int i = 0;
    while (str1[i] != '\0')
    {
        i++;
    }
    if (i>len)
    {
        return false;
    }
    i = 0;
    while (str1[i] != '\0')
    {
        if (str1[i] >= 'A'&&str1[i] <= 'Z')
        {
            str2[i] = str1[i] | 32;
        }
        else
        {
            str2[i] = str1[i];
        }
        i++;
    }
    str2[i] = '\0';
    return true;
}

注意:使用二进制对字符串大小写转换时原则:
a. 大写转化为小写——–>或操作符(|) 和32;
b. 小写转化为大写——–>且操作符(&)和95;

<4.字符串比较大小>
思路分析:
a. 首先是判断两个字符串的长度;
b. 然后根据长度来分别比较;
c. 若长度相同,再根据每个字符来比较。

//字符串比较大小 0-->相等 -1--->str2大 1--->str1大
int stringCompare(char* str1,char* str2)
{
    int i = 0, k = 0;
    while (str1[i] != '\0')
    {
        i++;
    }
    while (str2[k] != '\0')
    {
        k++;
    }
    if (i>k)
    {
        return 1;
    }
    else if(i<k)
    {
        return -1;
    }
    else  //表示两个字符串的长度相同
    {
        i = 0;
        //遍历每个字符
        while (str1[i]!='\0')
        {
            if (str1[i] != str2[i])
            {
                if (str1[i]>str2[i])
                {
                    return 1;
                }
                else
                {
                    return -1;
                }
            }
            i++;
        }
        return 0;
    }
}


----------
<5.字符串分隔>
思路分析:
a. 直接遍历字符串中的每个字符。

//瑕疵就是确保每个被分隔的字符串必须小于20
int stringSeparated(char* str1,char separate,char p[][20])
{
int i = 0;
int k = 0; //二维数组的第几行
int n = 0; //每行的字符
while (str1[i]!=’\0’)
{
if (str1[i]!=separate)
{
p[k][n] = str1[i];
i++;
n++;
}
else
{
p[k][n] = ‘\0’;
i++;
k++;
n = 0;
}
}
return k + 1;
}

void printF(char* str1,char* str2)
{
cout <<”str1:”<< str1 << endl;
cout <<”str2:”<< str2 << endl;
}

void printFP(char* str1, char* str2,char* str3)
{
cout << “str1:” << str1 << endl;
cout << “str2:” << str2 << endl;
cout << “str3:” << str3 << endl;
}

int main()
{
char str1[20] = “abc,def,ghi”;
char p[4][20] = {0};
int x=stringSeparated(str1, ‘,’, p);
cout << “x=” << x << endl;
for (int i=0;i

    原文作者:下忍
    原文地址: https://blog.csdn.net/wue1206/article/details/81612745
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞