当前位置: 移动技术网 > IT编程>开发语言>C/C++ > C和C++字符串问题解析

C和C++字符串问题解析

2018年10月08日  | 移动技术网IT编程  | 我要评论

在c和c++中没有字符串变量,字符串通常都是用一个字符数组来存放的。

这一章的题目能够让我们更好的掌握对数组的运用。

一、不使用库函数将整数转换为字符串
#include 

using namespace std;

void change(int n, char *str)
{
	int temp;
	int i = 0;
	char buf[10] = "0";
	if(n < 0)
		temp = -n;  //如果输入的数是一个负数就将它转为整数
	else 
		temp = n;

	if(str == null)    //判断传入的str是否有效
			return;

	while(temp != 0)
	{
		buf[i++] = temp % 10 + '0';  //将这个整数的每个位拆开,逆序放到buf中
		temp = temp / 10;
	}
	
	int j = 0;
	if(n < 0)     //如果是负数,就将str的第一个元素赋‘-’然后str向后移一个元素的长度
	{
		str[0] = '-';
		j++;
	}

	while(i > 0)
	{
		i--;
		str[j++] = buf[i];//将buf中的值再逆序放到str中。
	}
	str[j] = '\0'; //在最后一个元素后加上'\0'结尾
}

int main(int argc, char **argv)
{
	int num; 
	char p[10];
	cout << "请输入一个整型数据: ";
	cin >> num;
	change(num, p);
	cout << "输出为: " << p << endl;
    return 0;
}
二、不使用库函数将字符串转为数字
#include 

using namespace std;

int strint(char const  *str);

int main(int argc, char **argv)
{
	char p[20] = "0";
	cout << "请输入一个字符串:";
	cin.getline(p, 20); //从终端获取一个字符串;
	int n;
	n = strint(p);
	cout << "输出: " << n << endl;
    return 0;
}

int strint(char const *str)
{
	int temp = 0;
	const char *ptr = str;

	if((*str == '-') || (*str == '+')) //如果字符串的第一个字符是-或者+那么就将str向后移一位;
	{
		str++;
	}

	while(str)
	{
		if((*str < '0') || (*str > '9')) //如果遇到不是数字的字符就退出循环
			break;
		temp = temp * 10 + (*str - '0'); //将每个字符转为相应的数字
		str++;
	}
	if(*ptr == '-')
	{
		temp = -temp;
	}

	return temp;
}
三、实现strcpy函数
#include 
#include 

using namespace std;

void  mystrcpy(char *newstr, const char *oldstr);

int main(int argc, char **argv)
{
	char str[40] = "0";
	char ptr[20];

	cout << "请输入一个字符串: " ;
	cin.getline(str, 40);
	mystrcpy(ptr, str);
	cout << ptr << endl;
    return 0;
}

void mystrcpy(char *newstr, const char *oldstr)
{
	if((newstr == null) || (oldstr == null)) //判断这两个字符串的有效性
		return;
	while(*oldstr)
	{
		*newstr++ = *oldstr++;
	}
	*newstr = '\0';  //将最后一个字符赋值为'\0'结尾
}
四、strcpy和memcpy的区别

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容。

2、复制的方法不同。strcpy不需要指定长度,它遇到'\0'就会结束。memcpy需要根据第三个参数决定复制的长度。

3、用途不同。strcpy一般用于复制字符串,memcpy主要用于复制其他类型数据。

五、计算字符串长度的两种不同实现方法

1、通过一个局部变量计算有多少个字符。

int mystrlen(const char *str)
{
	int temp = 0;
	while(*str != '\0')
	{
		temp++;
		str++;
	}
	return temp;
}

这个在遍历的时候有两个变量在执行自增操作。

2、通过一个局部变量来记录遍历前str的位置,然后用遍历之后的地址减去之前的地址就是字符串的长度。

int mystrlen2(const char *str)
{
	if(str == null)
		return 0;
	const char* ptr = str;

	while(*str)
	{
		str++;
	}

	return (str - ptr);
}

这个在遍历的时候只要一个变量执行自增操作,所以效率会高很多,尤其是在字符串很长的情况下。

六、编程实现字符串中子串的查找
#include 

using namespace std;

const char* strstr(const char *src, const char* sub);

int main(int argc, char **argv)
{
	char p[] = "12346";
	char q[] = "45";
	const char *r = strstr(p,q);
	if(null == r)
			cout << "找不到这个字符串"<< endl;
	cout << r << endl;
    return 0;
}

const char* strstr(const char *src, const char* sub)
{
	const char *bp;
	const char *sp;

	if((src == null) || (sub == null)) //判断这两个字符串的有效性
		return src;
	while (*src)
	{
		bp = src; //用于内层循环,这样就不会改变src的地址
		sp = sub; //用于内层循环,这样就保护会改变sub的地址
		while(*bp++ == *sp++)
		{
			if(*sp == '\0')//如果找到了sub字符串就退出。
				return src;
		}
		src++; //将src自增
	}
	return null;
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网