C语言字符串函数与string相关函数

string类型与字符数组的相互转换

参考博文:c++中字符数组与字符串的转换

字符数组转换为string类型
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
	char a[10]="aaaabbbba";
	string s(&a[0],&a[strlen(a)]);
	cout<<s<<endl;
	return 0;
}
string类型转换为字符数组
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
	string s="aaaavvva";
	char a[10];
	strncpy(a,s.c_str(),s.length());

	for(int i=0;i<10;i++)
		cout << a[i];
	cout << endl;
    cout << strlen(a) << endl;
	return 0;
}

C语言的字符串

字符串转换函数
sscanf函数(字符串转换为各种类型)

参考博文:C语言sscanf函数的总结。该博文包含许多格式转换,比较详细,但可以使用其他函数实现同样功能,故没有罗列。

  • 头文件:stdio.h文件。
  • 说明:从一个字符串中读进与指定格式相符的数据。 sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源, 简单地说就是输入的类型不同。
  • 返回值:同scanf函数。例如,sscanf(str,"%d%d%s", &i,&i2, &s); 返回正确读入的元素个数。如果三个变成都读入成功会返回3,否则返回-1或0均表示转换不成功。
字符串赋值(指定长度)
char buf[512] = ; 
//直接赋值
sscanf("123456 ", "%s", buf); 
printf("%s\n", buf); //123456
//取指定长度的字符串
sscanf("123456 ", "%4s", buf); 
printf("%s\n", buf);//1234
数据类型转换(字符串转其它类型)
int ret;
char *str1;//转换char *类型
int  digit;
char buf1[255];
char buf2[255];
char buf3[255];
char buf4[255];

str1 = "china beijing 123";
ret = sscanf(str1, "%s %s %d", buf1, buf2, &digit);
printf("1.string=%s\n", str1);//str1="china beijing 123"
printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit);//ret=3,buf1="china",buf2="beijing",digit=123

string str2;//转换string类型
str2 = "1.234 13";
double m;
long long e;
sscanf(str2.c_str(),"%lf %lld", &m, &e);
printf("%.3f %lld\n", m, e);//得到m=1.234和e=13

sscanf中间的fomat可以使用字符串匹配参考关于sscanf函数的各种详细用法

过滤字符串
string = "android iphone wp7";
//在%号后面加一*号,代表过滤这个字符串,不读取
sscanf(string, "%s %*s %s", buf1, buf2);
printf("10.string=%s\n", string);
printf("10.buf1=%s, buf2=%s\n\n", buf1, buf2);
sprintf函数(其他类型转换为字符串)
  • 头文件:stdio.h文件。
  • 说明:类似printf,sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf在大多数场合可以替代itoa。并且使用方法与printf相似。
  • 返回值:sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。
格式化数字字符串
//把整数123打印成一个字符串保存在s中。
sprintf(s,%d”, 123);   //产生“123″
//可以指定宽度,不足的左边补空格:
sprintf(s,%8d%8d”, 123, 4567); //产生:“    123    4567″
//当然也可以左对齐:
sprintf(s,%-8d%8d”, 123, 4567); //产生:“123         4567″
控制浮点数打印格式
sprintf(s,%f”, 3.1415926);    //产生“3.141593″
sprintf(s,%10.3f, 3.1415626);   //产生:“     3.142″
sprintf(s,%-10.3f, 3.1415626); //产生:“3.142     ”
sprintf(s,%.3f, 3.1415626); //不指定总宽度,产生:“3.142″
控制精度
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
	char str[20];
    double f=14.309948;
    sprintf(str,"%6.2f",f);//四舍五入
    int n = strlen(str);
    printf("%d\n", n);//6
    for(int i=0; i<n; i++)
        printf("%c", str[i]);// 14.31,即6位,右对齐,首部一个空格
    printf("\n");
	return 0;
}
拼接成字符串
//数值数据拼接
char str[20];
int a=20984,b=48090;
sprintf(str,"%d %d",a,b);//"20984 48090"
//多个字符串连接成字符串
char str[20];
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
sprintf(str,"%.3s%.3s",s1,s2);//str="ABCTYx"
截取字符串
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
sprintf(str,"%.*s%.*s",2,s1,3,s2);//str="ABTYx"
sprintf(s, "%*.*f", 10, 2, 3.1415926); //s="      3.14",总共10位,小数位为2位
字符串实用函数
复制函数
  • strcpy(a, b),将b字符串复制给a字符串。
比较函数
  • strcmp(a, b),两个字符串相等返回0,第一个大于第二个返回>0的数,否则返回<0的数。
拼接函数
  • strcat(a, b),将b字符串拼接到a中,输出a可的拼接的字符串。
截取函数
  • strncpy(dest, src+a, b),字符串截取src字符串中a到a+b的字符串,并赋值给dest。注意需要加上一句dest[b]='\0'。
查找函数
  • strchr(char *s, char c):表示查找c在s字符串中第一次出现的位置(返回其指针),如果未找到则返回NULL。strrchr(char *s, char c):表示查找c在字符串s中最后一次出现的位置(返回其指针),如果未找到则返回NULL。
字符串分割函数
  • strtok函数。
    • 原型:char *strtok(char s[], const char *delim);//s为要分解的字符数组,delim为分隔符字符。
    • 当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
char str[] = "I,am,a,student; hello world!";

const char *split = ",; !";
char *p2 = strtok(str,split);
while( p2 != NULL )
{
    cout<<p2<<endl;
    p2 = strtok(NULL,split);
}

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

C++的string

参考博文:C++中的String的常用函数用法总结

string类型的使用函数

特点是可以使用下标遍历和迭代器遍历。

比较函数
  • C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。
    在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,
    比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面)
    同时,string (“aaaa”) <string(“aaaaa”),前面部分相同的情况下,长度小的自然就小。
  • compare()函数。支持多参数处理,支持用索引值和长度定位子串来进行比较。返回一个整数来表示比较结果,返回值意义如下:0:相等 1:大于 -1:小于。
// (A的ASCII码是65,a的ASCII码是97)
    // 前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
    string A("aBcd");
    string B("Abcd");
    string C("123456");
    string D("123dfg");
	 // "aBcd" 和 "Abcd"比较------ a > A
    cout << "A.compare(B):" << A.compare(B)<< endl;                          // 结果:1
    // "cd" 和 "Abcd"比较------- c > A
    cout << "A.compare(2, 3, B):" <<A.compare(2, 3, B)<< endl;                // 结果:1
    // "cd" 和 "cd"比较 
    cout << "A.compare(2, 3, B, 2, 3):" << A.compare(2, 3, B, 2, 3) << endl;  // 结果:0
    // 由结果看出来:0表示下标,3表示长度
    // "123" 和 "123"比较 
    cout << "C.compare(0, 3, D, 0, 3)" <<C.compare(0, 3, D, 0, 3) << endl;    // 结果:0
插入函数
  • insert()函数。在指定位置前插入字符。
 string s1;

// 尾插一个字符
 s1.push_back('a');
 s1.push_back('b');
 s1.push_back('c');
 cout<<"s1:"<<s1<<endl; // s1:abc

 // insert(pos,char):在制定的位置pos(迭代器)前插入字符char
 s1.insert(s1.begin(),'1');
 cout<<"s1:"<<s1<<endl; // s1:1abc
拼接函数
  • +操作符可用于字符串拼接以及字符串与字符的拼接。
string a = "1";
a = a+"2";//12
cout << a << endl;
a = a+'3';//123
cout << a << endl;
a = "0"+a;//0123
cout << a << endl;
a = '8'+a;//80123
cout << a << endl;
//注意字符只能有一个字符
删除函数
  • erase()函数,删除指定元素。
 string s1 = "123456789";
// s1.erase(s1.begin()+1);              // 结果:13456789
//使用迭代器时,第一个参数是起始元素的迭代器,第二个参数是终止元素迭代器的下一个迭代器
 // s1.erase(s1.begin()+1,s1.end()-2);   // 结果:189
 //使用下标时,第一个参数代表起始元素的下标,第二个参数代表删除字符串的长度
 s1.erase(1,6);                       // 结果:189
 //注意string类型的迭代器使用
 string::iterator iter = s1.begin();
 while( iter != s1.end() )
 {
     cout<<*iter;
     *iter++;
 }
 cout<<endl;
  • clear()。删除所有元素。
替换字符函数
  • replace()函数。
 string s1("hello,world!");
 cout<<s1.size()<<endl;                     // 结果:12
 //将从下标为s1.size()-1开始的1个字符,替换成1个字符'.'
 s1.replace(s1.size()-1,1,1,'.');           // 结果:hello,world.
 //将从下标为6开始的5个字符,替换成字符串"girl"
 s1.replace(6,5,"girl");                    // 结果:hello,girl.
 //将从s1.begin()迭代器开始,到s1.begin()+5-1对应的元素之间的字符串替换为'girl'
 s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
 cout<<s1<<endl;
大小写转换函数
  • 仅使用C语言提供的函数tolower(),toupper()等
string s = "ABCDEFG";
for( int i = 0; i < s.size(); i++ )
{
    s[i] = tolower(s[i]);
}
cout<<s<<endl;
  • 通过STL的transform算法配合的toupper和tolower来实现该功能。
    • transform函数的作用是:将某操作应用于指定范围的每个元素。
    • transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class。
string s = "ABCDEFG";
string result;
// 将s.begin()开始到s.end()-1结束的迭代器对应的每一个元素均进行tolower操作,同时将结果存储在以s.begin()迭代器开始的容器中。
transform(s.begin(),s.end(),s.begin(),::tolower);
cout<<s<<endl;
查找函数
  • find()函数。 返回值-1表示查找不到子串。
string s("dog bird chicken bird cat");
//字符串查找-----找到后返回首字母在字符串中的下标
// 1. 查找一个字符串,返回字符串首字符的下标
cout << s.find("chicken") << endl;        // 结果是:9
// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
cout << s.find('i',6) << endl;            // 结果是:11
// 3. 从字符串的末尾开始查找字符串,返回的还是首字符在字符串中的下标
cout << s.rfind("chicken") << endl;       // 结果是:9
// 4. 从字符串的末尾开始查找字符
cout << s.rfind('i') << endl;             // 结果是:18---因为是从末尾开始查找,所以返回第一次找到的字符
// 5. 在该字符串中查找第一个属于字符串s的字符
cout << s.find_first_of("13br98") << endl;  // 结果是:4---b
// 6. 在该字符串中查找第一个不属于字符串s的字符---先匹配dog,然后bird匹配不到,所以打印4
cout << s.find_first_not_of("hello dog 2006") << endl; // 结果是:4
cout << s.find_first_not_of("dog bird 2006") << endl;  // 结果是:9
// 7. 在该字符串最后中查找第一个属于字符串s的字符
cout << s.find_last_of("13r98") << endl;               // 结果是:19
// 8. 在该字符串最后中查找第一个不属于字符串s的字符------先匹配t--a---c,然后空格匹配不到,所以打印21
cout << s.find_last_not_of("teac") << endl;            // 结果是:21
排序函数
  • 直接使用sort(s.begin(), s.end())即可。
字符串分割函数
  • substr()函数。
string s1("0123456789");
//从下标为2的元素开始,截取长度为5的字符串
string s2 = s1.substr(2,5); // 结果:23456-----参数5表示:截取的字符串的长度
cout<<s2<<endl;
  • 使用find函数和substr函数来实现字符串分割。
string str = "I,am,a,student; hello world!", sub;
string split = ",; !";
int st = 0, cnt;
while(cnt=str.find_first_of(split, st))
{
    if(cnt==-1) break;
    sub = str.substr(st, cnt-st);
    cout << sub << endl;
    st = str.find_first_not_of(split, cnt+1);
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值