C/C++中的字符串一般末尾都有默认的”0\“,所以一般都是n+1个开销,容易造成越界。
char str[10];
strcpy(str, "0123456789");//报错,因为str至少要11才能复制
运行下面的程序,结果是什么?
<span style="white-space:pre"> </span>char str1[] = "hello";
char str2[] = "hello";
if (str1 == str2)
cout << "str1 str2 are same" << endl;
char* str3 = "hello";
char* str4 = "hello";
if (str3 == str4)
cout << "str3 str4 same" << endl;
实际的结果是输出str3 str4 same,这是因为为了节省内存,C++把常量字符放在单独的内存区域,当指针赋值给相同的常量字符串时,实际会指向相同的内存地址。也就是说str3和str4中的地址是一样的。
得到带空格的sting类型输入,在C++中,string的处理是非常灵活的,但是会遇到cin>>str时,自动过滤空格的情况,这时候,怎么办。
如华为机考的一道题。
计算字符串最后一个单词的长度,单词以空格隔开。
输入描述:
一行字符串。
输出描述:
整数N,最后一个单词的长度。
输入例子:
hello world
输出得到的是5,用cin>>str的话,就一直会报错,因为,自动过滤了空格,这就用用到 getline(cin,str)。
#include<iostream>
#include<string>
using namespace std;
//要考虑边界,就是当没有' '的时候
int returnNum(string a)
{
//计算长度
int len = a.length();//计算str的长度
int i = len;
while (a[i] != ' ')//边界条件
{
if (i == 0)
{
return len - i;
break;
}
i--;
}
return len-i-1;
}
int main()
{
string arr;
getline(cin, arr);
cout << returnNum(arr) << endl;
return 0;
}
转换进制,输入"0xA1"的16进制字符串,输出十进制,注意进制的转换。
int turnde(string str)
{
int len = str.length();//不用考虑0x,所以遍历从第三位数开始
int count = 0;
for (int i = 2; i < len; i++)
{
int temp;
if ((str[i] >= '0') && (str[i] <= '9'))
{
temp = str[i] - '0';//0的ASCII码为48
}
else if ((str[i] >= 'A') && (str[i] <= 'F'))
{
temp = str[i] - 'A' +10;
}
temp = temp*pow(16, len-i-1);
count += temp;
}
return count;
}
字符串赋值,如下代码,第一次编的时候,给str2赋值的时候,用了str2[i]=str1[len-i-1],这样是不行的,要用+=的操作。
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int main()<span style="white-space:pre"> </span>//目的,求一串字符串中镜像的长度,如12abba,abba为镜像,那么输出为4
{
string str1;
while (cin >> str1)
{
string str2;
int len = str1.length();
int count=0;//计数
int i = 0,j=0;
for (i = 0; i < len; i++)
{
str2+=str1[len - i - 1];//倒序的数列,赋值样用+=来赋值
}
for (i = 0; i < len; i++)
{
for (j = 0; j < len; j++)
{
int m = i;
int n = j;
int cnt = 0;
while (m < len&&n < len&&str1[m] == str2[n])
{
m++;
n++;
cnt++;
}
count = (cnt>count) ? cnt : count;
}
}
cout << count << endl;
}
return 0;
}
string中大小写转换的用法。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
while (cin >> a)
{
int len = a.length();
for (int i = 0; i < len; i++)
{
a[i]=tolower(a[i]);//大写转小写,判断是islower(c)和isupper(c)
a[i] = toupper(a[i]);//小写转大写
}
cout << a;
}
return 0;
}