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

浙公网安备 33010602011771号