(C++)字符串操作

转换模板

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

// 多参数函数模板:实现任意类型转换
// 将要转换的数据放入stringstream流中,
// 然后将流中的数据放入我们转换目标对象,最后返回转换后的
// 调用:out_type o =  convert<out_type>(in_value)
template<typename out_type, typename in_value>
out_type convert(const in_value & t){
    stringstream stream;
    stream << t;//向流中传值
    out_type result;//这里存储转换结果
    stream >> result;//向result中写入值
    return result;
}


int main(){
    // 字符串 -> 整数
    string str = "0012345";
    int sta = convert<int>(str);
    cout << sta << endl;

    // 整数 -> 字符串
    int a = 56789;
    string ats = convert<string>(a);
    cout << ats << endl;

    // 字符 -> 整数
    char c = '9';
    int cti = convert<int>(c);
    cout << cti << endl;
    cout << c - '0' << endl;

    // 整数 -> 字符
    int b = 7;
    char itc = convert<char>(b);
    cout << itc << endl;
    cout << char(b + '0') << endl;
}
/*输出:
12345
56789
9
9
7
7
*/

常用操作

#include <cctype>

char c

isdigit(c) // c是否是 数字
isalpha(c) // c是否是 字母
islower(c) // c是否为 小写字母
isupper(c) // c是否为 大写字母
isalnum(c) // c是否为 字母or数字
isspace(c) // c是否为 空格

tolower(c) // c转化为小写
toupper(c) // c转化为大写

string str

char ch

1.翻转字符串

①reverse( str.begin(), str.end() )  没有返回值

②string new_str( str.rbegin(), str.rend() )  有返回值

2.清空字符串

 ①str.clear()

②str = ""

3.字符与数字之间转换

①to_string(int a)               数字 -> 字符串 ,如 9 -> "9"

②int a = ch - '0'                字符 -> 数字 ,    如 '9' -> 9

③int a + '0' = char(ch)       数字 -> 字符 ,如 9 -> '9' ,不要漏掉char,不然输出的是对应的ASCII码,而不是字符了

④int t = stoi(str);  字符串->数字

自己写的函数:

 int str2int(const string& str) //字符串转数字
 {
        int temp = 0;
        const char ptr = str[0];  //ptr保存str字符串开头
        //判断正负数
        string str_t;
        if(ptr == '-') str_t = string(str.begin()+1, str.end());
        else str_t = str;
        
        int n = str_t.size();
        for(auto str:str_t)
        {
            if ((str < '0') || (str > '9'))  //如果当前字符不是数字
            {                       //则退出循环
                break;
            }
    
            temp = temp * 10 + (str - '0'); //如果当前字符是数字则计算数值
        }
    
        if (ptr == '-')     //如果字符串是以“-”开头,则转换成其相反数
        {
            temp = -temp;
        }    
        return temp;
 }

4.大小写转换 

①tolower(ch)  或者 ch + 32   将ch转换为小写   经常记成to_lower!!!!切记,没有下划线啊

②toupper(ch)  或者 ch - 32   将ch转换为大写

5.字符拼接

①string str_new = string( str.begin()+1, str.end() ) + str[0]   表示将第一个字符放到最后的位置

②.string tmp = str.substr(i, 2) 从i位置开始截取两个字符

6.增删查改

  • 改变string
    • 下标来删除或者插入元素
      • s.insert(pos, n, '!') // 在 pos位置之前插入 n 个 '!', 可以通过下标来插入元素
      • s.erase(pos, n) // 删除从pos位置开始的n个元素
    • append or replace函数
      • s.append(s1) // 在s尾部追加字符串s1
      • s.replace(begin, n, s1) // 从位置begin开始,删除n个字符,并插入字符串s1,s1的长度不需要跟n相同
  • 搜索操作
    • s.find(c) // 返回字符 or 字符串c 第一次出现的位置, 找不到返回 string::npos
    • s.rfind(c) // 返回字符 or 字符串 c 最后一次出现的位置
    • s.find(substr, pos ) // 在s中,从pos位置开始, 找第一次出现substr的位置
    • 常见的题型:找出字符串 中 子串 出现的所有位置进行替换为新字符串
    •             string::size_type pos = 0;
                  while((pos = s.find(oldStr, pos)) != string::npos){
                        s.replace(pos, oldStr.size(), newStr); 
                        pos += newStr.size(); // 更新开始搜索位置为替换newStr后的位置(这时候才是原字符串的位置)
                   }

C标准库string函数

strlen(p1); // 返回p1的长度,空字符不计算在内

strcpy(p1, p2); //  p2拷贝到p1 ,返回p1

strcmp(p1, p2); // p1 == p2 返回 0 ,p1 < p2 返回负值, p1 > p2返回正值

strcat(p1, p2); // p2追加到p1,返回p1

#include <cstring>
#include <iostream>
using namespace std;
int main(){
    char ch1[] = {'h', 'e', 'l', 'l', 'o', '\0'};
    char ch2[] = {'w', 'o', 'r', 'l', 'd', '\0'};
    char* p1 = ch1;
    char* p2 = ch2;
    cout << p1 << " , " << p2 << endl; // hello , world
    cout << "-------------------" << endl;
    
    int len = strlen(p1); // 返回p1的长度,空字符不计算在内
    cout << len << endl; // 5
    
    int t = strcmp(p1, p2); // p1 == p2 返回 0 ,p1 < p2 返回负值, p1 > p2返回正值
    cout << t << endl; // -15
    
    char* p3 = strcat(p1, p2); // p2追加到p1,返回p1
    cout << p3 << endl; // helloworld
    
    char *p4 = strcpy(p1, p2); // p1 = p2,返回p1
    cout << p4 << endl; // world
    return 0;
}

C风格与C++风格字符串接口

string s = "hello world!";

string类型==>C风格的字符串,需要调用c_str()接口

const char* str = s.c_str() // 不改变const属性

char* str = const_cast<char *>(s.c_str()) // 改变const属性

C字符串 ==》 string

1)直接赋值;2)构造转换实现

// char*转换为string
// (注意,定义char *变量,并直接赋值,最好定义为const变量,否则编译器警告)
const char *st = "hello";

// 赋值转换
string st1 = st;
cout << st1 << endl;

// 构造转换
string s1(st, st + strlen(st));
cout << s1 << endl;

// 改变const char *变量值
st = "lalala";
cout << st << endl;

const char* p; p是一个变量指针,指向一个常量地址,p本身的地址可以改变,指向的那块地址的内容不能改变

C库函数

1、qsort

qsort参考链接

功能: 使用快速排序例程进行排序
  头文件:stdlib.h
  用法:  void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 
  参数: 1 待排序数组,排序之后的结果仍放在这个数组中
      2 数组中待排序元素数量
        3 各元素的占用空间大小(单位为字节)
             4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)

  qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
  如比较函数 int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。

比如对int类型排序

int num[100];
int cmp_int(const void* _a , const void* _b)  //参数格式固定
{
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}

qsort(num,100,sizeof(num[0]),cmp_int); 

可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

比如对字符串排序

char word[100][10];
int cmp_string(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;  //强制类型转换
    char* b = (char*)_b;
    return strcmp(a,b);
}

qsort(word,100,sizeof(word[0]),cmp_string); 

 关于double的要注意,返回的不一样

double in[100];
int cmp_double(const void* _a , const void* _b)  //参数格式固定
{
    double* a = (double*)_a;    //强制类型转换
    double* b = (double*)_b;
    return *a > *b ? 1 : -1;   //特别注意
}

qsort(in,100,sizeof(in[0]),cmp_double);

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jasscical

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

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

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

打赏作者

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

抵扣说明:

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

余额充值