//输出字符数组 其最后一位非‘\0’ 所以输出带?号
char szbuf[] = {'m', 'a', 'q', 'i'};
cout << szbuf << endl;
//数组被截取,只输出‘hello’
char szbuf_[50] = {'h', 'e', 'l', 'l', 'o', '\0', ' ', 'f', 'r', 'i', 'e', 'n', 'd', 's', '.'};
cout << szbuf_ << endl;
//输出‘maqi’ 不同于‘例1’ 数组长度为5 最后一位为‘\0’
char szbuf__[5] = {'m', 'a', 'q', 'i'};
cout << szbuf__ << endl;
//无论你怎么输入 最后输出的结果都为输入的内容
char szbuf___[4];
cin >> szbuf___;
cout << szbuf___ << endl;
void cmpArrayAndString() {
cout << "==========cmpArrayAndString=========="<< endl;
char des[50] = "hello";
int len = strlen(des);
cout << "len = " << len << endl;
int size = sizeof(des);
cout << "size = " << size << endl;
}
打印结果:sizeof求的是数组长度,strlen求的是String的长度。
==========cmpArrayAndString==========
len = 5
size = 50
//堆内生成一个string
char *getString() {
{
char *s = (char *) calloc(100, sizeof(char *));
if (s)
strcpy(s, "abc");
return s;
}
}
//获取字符串
char *mChars = getString();
printf("%s\n", mChars);
//复制
char copy[10] = {0};
strcpy(copy, mChars);
cout << "copy===" << copy << endl;
cout << "copy.len===" << strlen(copy) << endl;
//比较“abc”和“9bc”
int cmp = strcmp("9bc", mChars);
cout << "cmp===" << cmp << endl;
//9bc 小于 abc 结果为 -1;
if (cmp < 0) {
// strcat 不允许char* 拼接 因为 指针指向的是地址
// warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
// 尝试解决 仍报错
// typedef char *String;
// String cmp = "acc";
// 尝试解决 使用数组解决
char cmp[] = "acc";
char *newString = strcat(cmp, mChars);
cout << "newString===" << newString << endl;
}
//cmd:请按任意键继续. . .
system("pause");
释放堆内存
free(mChars);
字符串的四种拼接方法
void toItoa() {
string s = "maqi";
int a = 520;
//方式一:_itoa
char *buf = new char[10];//2147483647 int最大值
_itoa(a, buf, 10); //itoa虽然可以转化为各种进制,但是注意不能是float或者double
cout << s + buf << " | ";
_itoa(a, buf, 16);
cout << s + buf << endl;
//方式二:ostringstream
ostringstream oss;
a = 52;
double b = .1314;
oss << s << a << b;
cout << oss.str() << endl;
//方式三:to_string 拼接 和 java 类似
a = 520;
string res = s + to_string(a);
cout << res << endl;
b = 5.20;
res = s + to_string(b);
//设置容量8,超出的部分丢弃
res.resize(8);
cout << res << endl;
//方式四:C语言原始方法:sprintf
a = 52;
b = .1314;
char *ss = "maqi";
char *bufs = new char[strlen(ss) + sizeof(a) + 1];
sprintf(bufs, "%s%d%.4f", ss, a, b);
printf("%s\n", bufs);
}
字符串切割的两种方法
vector<string> splitWithStl(const string &str, const string &pattern) {
vector<string> resVec;
if ("" == str) {
return resVec;
}
//方便截取最后一段数据
string strs = str + pattern;
size_t pos = strs.find(pattern);
size_t size = strs.size();
while (pos != string::npos) {
string x = strs.substr(0, pos);
resVec.push_back(x);
strs = strs.substr(pos + 1, size);
pos = strs.find(pattern);
}
return resVec;
}
vector<string> split(const string &str, const string &pattern) {
//const char* convert to char*
char *strc = new char[strlen(str.c_str()) + 1];
strcpy(strc, str.c_str());
vector<string> resultVec;
char *tmpStr = strtok(strc, pattern.c_str());
while (tmpStr != NULL) {
resultVec.push_back(string(tmpStr));
tmpStr = strtok(NULL, pattern.c_str());
}
delete[] strc;
return resultVec;
};
申明
vector<string> splitWithStl(const string &str, const string &pattern);
vector<string> split(const string &str, const string &pattern);
调用
void subStringfun(string name) {
cout << "subStringfun:name = " << name << endl;
}
void subStringfun_(string name) {
cout << "subStringfun:name = " << name << endl;
}
void splitOne() {
string name = "maqi|666";
const vector<string> &vector = splitWithStl(name, "|");
cout << " vector.size() = " << vector.size() << endl;
for_each(vector.begin(), vector.end(), subStringfun);
}
//注意这里" ,-.|" 匹配所有 功能比splitWithStl强大
void splitTwo() {
string mName = "ma qi,666|000-111.";
const vector<string> &vectorSplit = split(mName, " ,-.|");
cout << " vectorSplit.size() = " << vectorSplit.size() << endl;
for_each(vectorSplit.begin(), vectorSplit.end(), subStringfun_);
}
打印结果
字符串切割:
vector.size() = 1
subStringfun:name = maqi|6 6 6
vectorSplit.size() = 5
subStringfun:name = ma
subStringfun:name = qi
subStringfun:name = 666
subStringfun:name = 000
subStringfun:name = 111