c语言字符串练习

1、实现一个函数把整数转换成字符串

#include <stdio.h>
        char* itoa(char* str,int num);
    
char* itoa(char* str,int num)
{
	int tmp = abs(num) , i = 0;
	while(tmp)
	{
		str[i++] = tmp % 10 + '0';
		tmp /= 10;
	}
	if(num < 0)
	{
		str[i++] = '-';
	}
	str[i] = '\0';
	char* s = str , *e = str+i-1;
	while(s<e)
	{
		char t = *s;
		*s = *e;
		*e = t;
		s++,e--;
	}
	return str;
}

int main(int argc,const char* argv[])
{
	char str[11] = {};
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d",&num);
	puts(itoa(str,num));
}

2、实现一个函数把字符串单词首字母转换成大写,字符串中空格转换成%_%。

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h> 
char* str_opt(char* str)
{
	int i = 0 , cnt = 0;
	bool flag = true;
	while(str[i])
	{
		if(isalpha(str[i]) && flag)
		{
			flag = false;
			if(islower(str[i]))
				str[i] -= 32;
		}
		
		if(!isalpha(str[i]))
		{
			flag = true;
		}
		if(isspace(str[i]))
		{
			cnt++;
		}
		i++;
	}
	int end = i+cnt*2;
	str[end--] = '\0';
	while(--i)
	{
		if(isspace(str[i]))
		{
			str[end--] = '%';
			str[end--] = '_';
			str[end--] = '%';
		}
		else
		{
			str[end--] = str[i];
		}
	}
	return str;
}

int main(int argc,const char* argv[])
{
	char str[20] = "sun ling ling";
	puts(str_opt(str));
}

3、实现一个函数把字符串中的单词逆序。

​ modifying one node will also change the other
​ other the change also will node one modifying

#include <stdio.h>
#include <ctype.h>
#include <string.h>
void reverse(char* s,char* e)
{
	while(s < e)
	{
		char t = *s;
		*s = *e;
		*e = t;
		s++,e--;
	}
}

char* str_reverse(char* str)
{
	size_t len = strlen(str);
	reverse(str,str+len-1);
	char *s = str , *e = NULL;
	for(int i=1; i<=len; i++)
	{
		if(!isalpha(str[i])&&'\''!=str[i])
		{
			e = str+i-1;
			reverse(s,e);
		}
		if((isalpha(str[i])||('\''==str[i]))&&(!isalpha(str[i-1])&&'\''!=str[i-1]))
		{
			s = str + i;
		}
	}
	return str;
}

int main(int argc,const char* argv[])
{
	char str[] = "sun ling's ling";
	puts(str_reverse(str));
}


4、实现两个超大整数的相加。

第一种方法

#include <stdio.h>
#include <string.h>
void resver(char* str)
{
	size_t len = strlen(str);
	for(int i=0; i<len/2; i++)
	{
		char ch = str[i];
		str[i] = str[len-i-1];
		str[len-i-1] = ch;
	}
}

char* str_add(char* s1,char* s2,char* ret)
{
	size_t len1 = strlen(s1);
	size_t len2 = strlen(s2);
	char* tmp = ret;
	char carry = 0;
	while(len1&&len2)
	{
		char s = (s1[len1-1]-'0')+(s2[len2-1]-'0')+carry;
		*tmp = s%10+'0';
		carry = s/10;
		len1--,len2--,tmp++;
	}

	while(len1)
	{
		char s = s1[len1-1]-'0'+carry;
		*tmp = s % 10 + '0';
		carry = s/10;
		len1--,tmp++;
	}
	while(len2)
	{
		char s = s2[len2-1]-'0'+carry;
		*tmp = s % 10 + '0';
		carry = s/10;
		len2--,tmp++;
	}
	if(carry)
		*tmp++ = carry+'0';
	*tmp = '\0';
	resver(ret);
	return ret;
}

int main(int argc,const char* argv[])
{
	char ret[100];
	puts(str_add("99999","1",ret));
}

第二种方法

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void resver(char* str)
{
	size_t len = strlen(str);
	for(int i=0; i<len/2; i++)
	{
		char ch = str[i];
		str[i] = str[len-i-1];
		str[len-i-1] = ch;
	}
}

char* str_add(const char* s1,const char* s2,char* ret)
{
	const char* t1 = s1+strlen(s1)-1;
	const char* t2 = s2+strlen(s2)-1;
	const char* sl = NULL , *tl = NULL;

	char* tmp = ret;
	char carry = 0;
	while(true)
	{
		char s = (*t1-'0')+(*t2-'0')+carry;
		*tmp++ = s%10+'0';
		carry = s/10;
		if(t1 == s1)
		{
			tl = t2;
			sl = s2;
			break;
		}
		if(t2 == s2)
		{
			tl = t1;
			sl = s1;
			break;
		}
		t1--,t2--;
	}
	while(tl!=sl)
	{
		char s = (*tl-'0')+carry;
		*tmp = s%10+'0';
		carry = s/10;
		tl--,tmp++;
	}
	if(carry)
		*tmp++ = carry+'0';
	*tmp = '\0';
	resver(ret);
	return ret;
}

int main(int argc,const char* argv[])
{
	char ret[100];
	puts(str_add("99999","1",ret));
}

posted @ 2021-07-10 17:09  de06  阅读(173)  评论(0)    收藏  举报