欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-26 17:48:29
在c和c++中没有字符串变量,字符串通常都是用一个字符数组来存放的。 这一章的题目能够让我们更好的掌握对数组的运用。 一、不使用库函数将整数转换为字符串 #include using n...

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