C/C++中字符串问题汇总

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值