参考博文:c++中字符数组与字符串的转换
#include
#include
using namespace std;
int main()
{
char a[10]="aaaabbbba";
string s(&a[0],&a[strlen(a)]);
cout<<s<<endl;
return 0;
}
#include
#include
#include
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函数的总结。该博文包含许多格式转换,比较详细,但可以使用其他函数实现同样功能,故没有罗列。
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);
spritnf在大多数场合可以替代itoa
。并且使用方法与printf相似。//把整数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
#include
#include
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位
注意需要加上一句dest[b]='\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的常用函数用法总结
特点是可以使用下标遍历和迭代器遍历。
// (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
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;
//注意字符只能有一个字符
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;
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;
string s = "ABCDEFG";
for( int i = 0; i < s.size(); i++ )
{
s[i] = tolower(s[i]);
}
cout<<s<<endl;
string s = "ABCDEFG";
string result;
// 将s.begin()开始到s.end()-1结束的迭代器对应的每一个元素均进行tolower操作,同时将结果存储在以s.begin()迭代器开始的容器中。
transform(s.begin(),s.end(),s.begin(),::tolower);
cout<<s<<endl;
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
string s1("0123456789");
//从下标为2的元素开始,截取长度为5的字符串
string s2 = s1.substr(2,5); // 结果:23456-----参数5表示:截取的字符串的长度
cout<<s2<<endl;
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);
}