面试中的一些字符串操作

13 篇文章 0 订阅
//字符串转整形
int str_to_int(char str[])
{
	int num, i = 0, flag = 0;
	if (str[i] == '+' || str[i] == '-')
	{
		if (str[i] == '-')
			flag = 1;
		++i
	}
	for (num = 0; str[i] != '\0'; ++ i)
	{
		num = 10 * num + (str[i] - '0');
	}
	return flag? 0 - num: num;
}

//整形转字符串
char *int_to_str(int num, char *str, int radix)
{
	int flag, i, j, k = 0, mid;
	char tmp;
	if (num < 0)
	{
		str[k++] = '-';
		num = 0 - num;
	}
	i = k;
	while (num)
	{
		str[i++] = num % radix;
		num /= radix;
	}
	j = i - 1;
	mid = (j + k) / 2;
	for (i = k; i < j; ++i, --j)
	{
		tmp = str[i];
		str[i] = str[j];
		str[j] = tmp;
	}
	return str;
}

//查找字串在母串中出现的次数
int num_zizhuan(char *str1, char *str2)
{
	int count = 0;
	char *s, *s1, *s2;
	s = str1;
	while (*s != '\0')
	{
		s1 = s;
		s2 = str2;
		while (*s1 != '\0' && *s1 == *s2)
		{
			++s1;
			++s2;
		}
		if (*s2 == '\0')
			++count;
		++s;
	}
	return count;
}

//查找第一个匹配子串位置,如果返回的是s1长度len1表示没有找到
int locate(char str1, char str2)
{
	int i, j, k, len1, len2;
	len1 = strlen(str1);
	len2 = strlen(str2);
	if (len1 < len2)
		return len1;
	for (i = 0; i < len1 - len2; ++ i)
	{
		for (j = i, k = 0; j < len1 && str1[j] == str2[k]; ++j, ++k);
		if (k == len2)
			break;
	}
	return i;
}

//实现strcpy函数
char *strcpy(char *dest, const char *sour)
{
	assert (NULL != dest && NULL != sour);
	char *s;
	s = dest;
	while (*s++ = *sour++);
	return dest;
}

//实现strcmp函数
int strcmp(char *str1,char *str2)
{
	assert(str1 != NULL && str2 != NULL);
	while (*str1 != '\0' && *str1 == *str2)
	{
		++str1;
		++str2;
	}
	if (*str1 == *str2)
		return 0;
	else if (*str1 > *str2)
		return 1;
	return -1;
}

//实现字符串翻转
void reserve(char* str)
{
	assert(str != NULL);
	int i, len;
	char tmp;
	len = strlen(str);
	for (i = 0; i < len / 2; ++ i)
	{
		tmp = str[i];
		str[i] = str[len - 1 - i];
		str[len - 1 - i] = tmp;
	}
	return;
}

//给定字符串A和B,输出A和B中的最大公共子串长度
char *com_str(char *shortstr, char *longstr)
{
	assert(shortstr != NULL && longstr != NULL);
	int len1, len2, i, j, max, **a;
	len1 = strlen(longstr);
	len2 = strlen(shortstr);
	a = new int *[len1 + 1];
	for (i = 0; i <= len1; ++i)
		a[i] = new int *[len2 + 1];

	for (i = 0; i <= len1; ++i)
		for (j = 0; j <= len2; ++j)
			a[i][j] = 0;

	for (i = 1, max = 0; i <= len1; ++i)
		for (j = 1; j <= len2; ++j)
		{
			if (longstr[i - 1] == shortstr[j - 1])
				a[i][j] = a[i - 1][j - 1] + 1;
			if (a[i][j] > max)
				max = a[i][j];
		}
	return max;
}

//判断一个字符串是不是回文
int IsReverseStr(char *str)
{
	assert(str != NULL);
	int len, i;
	len = strlen(str);
	for (i = 0; i < len / 2; ++i)
	{
		if (str[i] != str[len - i - 1])
			return 0;
	}
	return 1;
}

//写一个函数, 在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数所指内存。
int num_max(char *outstr, char *instr)
{
	assert(outstr != NULL && instr != NULL);
	int count, max, i, flag, len, start, m_start;
	len = strlen(instr);
	count = max = flag = start = m_start = 0;
	for (i = 0; i < len; ++i)
	{
		if (instr[i] <= '9' && instr[i] >= '0')
		{
			if (0 == flag)
			{
				start = i;
				flag = 1;
			}
			++count;
		}
		else
		{
			if (1 == flag)
			{
				flag = 0;
				if (count > max)
				{
					max = count;
					m_start = start;
					count = 0;
				}
			}
		}
	}

	for (i = m_start; i < max; ++i)
		outstr[i - m_start] = instr[i];
	outstr[i - m_start] = '\0';
	return max;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值