Let’s Make C++ Great Again——string与常用字符处理函数

string

在C++中,string是一个表示字符串的类,它提供了一系列方法来方便地操作字符串。与C语言中的字符串不同,string类是一个对象,可以像其他对象一样使用各种成员函数来处理它。

下面是一些常用的string方法:

  • length()size():返回字符串中字符的个数。
  • substr(pos, len):返回从位置pos开始,长度为len的子串。
  • append(str)operator+=(str):在字符串末尾添加str。
  • insert(pos, str):在位置pos插入字符串str。
  • erase(pos, len):删除从位置pos开始,长度为len的子串。
  • replace(pos, len, str):用字符串str替换从位置pos开始,长度为len的子串。
  • find(str)find(str, pos):在字符串中查找子串str,返回子串的起始位置,如果查找不到则返回string::npos
  • compare(str):比较字符串与str,返回0表示相等,小于0表示当前字符串小于str,大于0表示当前字符串大于str。
  • c_str():返回一个指向字符串内容的指针。
  • empty():判断字符串是否为空,如果为空则返回true,否则返回false。
  • clear():清空字符串中的所有字符。
  • push_back(ch):在字符串末尾添加字符ch。
  • pop_back():删除字符串末尾的一个字符。
  • getline():从输入流中读取一行字符串,直到遇到换行符或文件结束符。
  • at(index)operator[](index):返回字符串中索引为index的字符。
  • front():返回字符串中的第一个字符。
  • back():返回字符串中的最后一个字符。
  • reserve(n):预留至少能容纳n个字符的空间,避免频繁分配内存。
  • capacity():返回当前字符串能容纳的最大字符数。
  • resize(n)resize(n, ch):调整字符串的大小为n,如果字符串变大,则在末尾填充字符ch;如果字符串变小,则删除末尾的字符。
  • shrink_to_fit():将字符串的容量缩小到与其大小相同,释放多余的内存。

下面是一个使用string类的例子,将一个字符串中的大写字母转换为小写字母:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "Hello, World!";
    for (int i = 0; i < s.length(); i++) {
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[i] = s[i] - 'A' + 'a';
        }
    }
    cout << s << endl;

    return 0;
}
hello, world!

可以看到,程序成功地将字符串中的大写字母转换为小写字母。

使用string类的例子,统计一个字符串中单词的个数:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "Hello, World! This is a test.";
    int count = 0;
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == ' ') {
            count++;
        }
    }
    count++;  // 最后一个单词没有空格,所以需要额外加一次

    cout << "Number of words: " << count << endl;

    return 0;
}
Number of words: 6

可以看到,程序成功地统计了字符串中单词的个数。

总之,string类是一个非常实用的类,可以方便地处理字符串。在实际编程中,我们可以根据需要使用不同的方法来操作字符串,以实现各种功能。

在算法模拟题中

在算法模拟题中,string类是一个非常有用的工具,可以方便地处理字符串。下面是一些常见的使用string的算法模拟题:

翻转字符串:

将一个字符串翻转过来,例如将字符串"hello"变成"olleh"。可以使用string类的reverse()方法来实现。

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "hello";
    reverse(s.begin(), s.end());

    cout << s << endl;

    return 0;
}
olleh

判断回文字符串:

判断一个字符串是否是回文字符串,即正着读和倒着读都一样,例如"level"是回文字符串,而"hello"不是。可以使用string类的reverse()方法或双指针来实现。

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "level";
    string t = s;
    reverse(t.begin(), t.end());

    if (s == t) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}
Yes

字符串查找:

在一个字符串中查找另一个字符串出现的位置,例如在字符串"hello, world"中查找子串"wor"的位置。可以使用string类的find()方法来实现。

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "hello, world";
    string t = "wor";
    int pos = s.find(t);

    if (pos != string::npos) {
        cout << "Found at position " << pos << endl;
    } else {
        cout << "Not found" << endl;
    }

    return 0;
}
Found at position 7

字符串替换:

在一个字符串中将某个子串替换为另一个字符串,例如将字符串"hello, world"中的子串"world"替换为"universe"。可以使用string类的replace()方法来实现。

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "hello, world";
    string t = "world";
    string u = "universe";
    int pos = s.find(t);

    if (pos != string::npos) {
        s.replace(pos, t.length(), u);
    }

    cout << s << endl;

    return 0;
}
hello, universe

总之,string类是一个非常实用的工具,在算法模拟题中可以方便地处理字符串。需要注意的是,在使用string类时,要注意字符串的长度、空间占用等问题,以避免出现不必要的错误。

常用字符处理函数

当然,以下是一些在编程中常用的字符处理函数:

strlen()

strlen() 函数可以返回一个字符串的长度,即该字符串中非空字符的数量。例如:

char s[] = "hello world";
int len = strlen(s);  // len = 11

需要注意的是,strlen() 函数只能用于处理以 \0 结尾的字符串,否则可能会导致未定义的行为。

strcpy()

strcpy() 函数可以将一个字符串复制到另一个字符串中。例如:

char s1[] = "hello";
char s2[10];
strcpy(s2, s1);  // 将 s1 复制到 s2 中

需要注意的是,strcpy() 函数会将源字符串中的 \0 也复制到目标字符串中,因此需要确保目标字符串有足够的空间来存储复制后的字符串。

strcat()

strcat() 函数可以将一个字符串追加到另一个字符串的末尾。例如:

char s1[] = "hello";
char s2[] = "world";
strcat(s1, s2);  // 将 s2 追加到 s1 的末尾

需要注意的是,strcat() 函数会将源字符串中的 \0 也追加到目标字符串的末尾,因此需要确保目标字符串有足够的空间来存储追加后的字符串。

strcmp()

strcmp() 函数可以比较两个字符串的大小关系。如果两个字符串相等,则返回 0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。例如:

char s1[] = "hello";
char s2[] = "world";
int cmp = strcmp(s1, s2);  // cmp < 0

需要注意的是,strcmp() 函数会比较两个字符串的每个字符,直到出现不同的字符或其中一个字符串结束。

toupper() 和 tolower()

toupper() 函数可以将一个小写字母转换为大写字母,而 tolower() 函数可以将一个大写字母转换为小写字母。例如:

char c = 'a';
char d = toupper(c);  // d = 'A'

isdigit() 和 isalpha()

isdigit() 函数可以判断一个字符是否为数字字符(即 0 到 9 中的任意一个字符),而 isalpha() 函数可以判断一个字符是否为字母字符(即 A 到 Z 或 a 到 z 中的任意一个字符)。例如:

char c = '9';
if (isdigit(c)) {
    cout << c << " 是数字字符。" << endl;
}

这些只是编程中常用的一些字符处理函数的例子。通过使用这些函数,您可以使您的代码更简洁、易读和易于维护。

strncpy()

strncpy() 类似于 strcpy(),但它允许您从源字符串复制指定数量的字符到目标字符串中。例如:

char s1[] = "hello";
char s2[10];
strncpy(s2, s1, 3);  // 复制 s1 的前 3 个字符到 s2 中

strchr() 和 strrchr()

strchr() 函数搜索字符串中指定字符的第一个出现位置,并返回该位置的指针,而 strrchr() 函数搜索字符串中指定字符的最后一个出现位置,并返回该位置的指针。例如:

char s[] = "hello world";
char* p = strchr(s, 'o');  // p 指向第一个 'o'
p = strrchr(s, 'o');  // p 指向最后一个 'o'

strstr()

strstr() 函数搜索字符串中指定子字符串的第一个出现位置,并返回该位置的指针。例如:

char s[] = "hello world";
char* p = strstr(s, "world");  // p 指向 "world" 子字符串

isalnum() 和 isxdigit()

isalnum() 函数可以判断一个字符是否为字母或数字字符,而 isxdigit() 函数可以判断一个字符是否为十六进制数字字符。例如:

char c = 'A';
if (isalnum(c)) {
    cout << c << " 是字母或数字字符。" << endl;
}
if (isxdigit(c)) {
    cout << c << " 是十六进制数字字符。" << endl;
}

isspace()

isspace() 函数可以判断一个字符是否为空格字符(即空格、制表符、换行符、回车符、换页符或垂直制表符中的任意一个字符)。例如:

char c = ' ';
if (isspace(c)) {
    cout << c << " 是空格字符。" << endl;
}

isupper() 和 islower()

isupper() 函数可以判断一个字符是否为大写字母,而 islower() 函数可以判断一个字符是否为小写字母。例如:

char c = 'A';
if (isupper(c)) {
    cout << c << " 是大写字母。" << endl;
}

sprintf()

sprintf() 函数可以通过替换占位符来格式化字符串。例如:

int x = 42;
char s[20];
sprintf(s, "答案是 %d。", x);  // s = "答案是 42。"

这些只是编程中常用的一些字符处理函数的例子。通过使用这些函数,您可以使您的代码更简洁、易读和易于维护。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FeatherWaves

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

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

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

打赏作者

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

抵扣说明:

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

余额充值