atoi、itoa,strcpy,strcmp,memcpy等实现
整数字符串的转化
1、直接采用现有函数
(1)直接采用itoa实现整数到字符串的转换
函数形式为: char *itoa(int value, char *string, int radix);
该函数包含在头文件stdlib.h中。int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等。
具体实现为:
1 #include<stdlib.h> 2 #include<stdio.h> 3 void main() 4 { 5 int a=123; 6 char string[10]; 7 itoa(a,string,10); 8 printf("整数:%d\n字符串:%s",a,string); 9 }
(2)直接采用atoi实现字符串到整数的转换
函数形式为: int atoi(const char *nptr);
1 #include<stdlib.h> 2 #include<stdio.h> 3 void main() 4 { 5 int a; 6 char string[10]="123"; 7 a=atoi(string); 8 printf("转换后的整数:%d",a); 9 }
2、不采用现有的itoa和atoi函数
(1)整数到字符串的转换
具体实现为:
1 #include<stdlib.h> 2 #include<stdio.h> 3 void main() 4 { 5 int i,j=0,a=123456; 6 char temp[10],string[10]; 7 while(a) 8 { 9 i=a%10+'0'; 10 temp[j++]=i; 11 a=a/10; 12 } 13 i=0; 14 j--; 15 while(j>=0) 16 string[i++]=temp[j--]; 17 string[i]='\0'; 18 printf("转换成的字符串为:%s",string); 19 }
(2)字符串到整数的转换
具体实现为:
1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<string> 4 void main() 5 { 6 char temp[10],string[10]="123456"; 7 int i=0,j,a=0; 8 strcpy(temp,string); 9 while(temp[i]) 10 { 11 a=a*10+(temp[i]-'0'); 12 i++; 13 } 14 printf("转换为整数:%d",a); 15 }
14、2 字符数组和strcpy
(1)面试题1
strcpy字符串拷贝函数的实现
strcpy的原型为:char*strcpy(char *strDest,const char *strSrc)
具体实现为:
1 #include<stdlib.h> 2 #include<stdio.h> 3 char *strcpy1(char *strDest,char *strSrc) 4 { 5 char *temp=strDest; 6 while((*strDest=*strSrc)!='\0') 7 { 8 strDest++; 9 strSrc++; 10 } 11 return temp; 12 } 13 14 void main() 15 { 16 char str[]="123iamhappy!"; 17 char strDest[50]; 18 strcpy1(strDest,str); 19 printf("最终的结果为:%s\n",strDest); 20 }
(2)面试题3
编写一个函数,把一个char组成的字符串循环右移n位
具体实现为:
方法1:自己实现的
1 //(1)形参和实参均为数组名 2 #include<stdio.h> 3 #include<string.h> 4 void loopmove(char temp[],int n) 5 { 6 int i=0,j,len; 7 char c; 8 len=strlen(temp); 9 for(i=0;i<n;i++) 10 { 11 c=temp[len-1]; 12 for(j=len-2;j>=0;j--) 13 temp[j+1]=temp[j]; 14 temp[0]=c; 15 } 16 } 17 void main() 18 { 19 char s[]="123456789"; 20 int steps=2; 21 loopmove(s,steps); 22 printf("%s\n",s); 23 } 24 //-------------------------------------------------------------------------- 25 //(2)形参为指针变量,实参为数组名 26 #include<stdio.h> 27 #include<string.h> 28 void loopmove(char *p,int n) 29 { 30 int i,j,len; 31 char *q, temp; 32 len=strlen(p); 33 printf("%d\n",len); 34 35 for(i=0;i<n;i++) 36 { 37 q=p; 38 temp=*(p+len-1); 39 for(j=len-2;j>=0;j--) 40 { 41 *(p+j+1)=*(p+j); 42 } 43 *p=temp; 44 } 45 } 46 void main() 47 { 48 char s[]="123456789"; 49 int steps=2; 50 loopmove(s,steps); 51 printf("%s\n",s); 52 } 53 //-------------------------------------------------------------------------- 54 (3)//形参为指针变量,实参也为指针变量 55 #include<stdio.h> 56 #include<string.h> 57 void loopmove(char *p,int n) 58 { 59 int i,j,len; 60 char *q, temp; 61 len=strlen(p); 62 // printf("%d\n",len); 63 64 for(i=0;i<n;i++) 65 { 66 q=p; 67 temp=*(p+len-1); 68 for(j=len-2;j>=0;j--) 69 { 70 *(p+j+1)=*(p+j); 71 } 72 *p=temp; 73 } 74 } 75 void main() 76 { 77 char *p,s[]="123456789"; 78 int steps=2; 79 p=s; 80 loopmove(p,steps); 81 printf("%s\n",p); 82 } 83 //------------------------------------------------------------------------ 84 (4)//形参为数组名,实参为指针变量 85 #include<stdio.h> 86 #include<string.h> 87 void loopmove(char temp[],int n) 88 { 89 int i=0,j,len; 90 char c; 91 len=strlen(temp); 92 for(i=0;i<n;i++) 93 { 94 c=temp[len-1]; 95 for(j=len-2;j>=0;j--) 96 temp[j+1]=temp[j]; 97 temp[0]=c; 98 } 99 } 100 101 void main() 102 { 103 char *p,s[]="123456789"; 104 int steps=2; 105 p=s; 106 loopmove(p,steps); 107 printf("%s\n",p); 108 }
方法2:利用strcpy函数
1 #include<stdio.h> 2 #include<string.h> 3 #define max 100 4 void loopmove(char*pstr,int steps) 5 { 6 char temp[max]; 7 int n=strlen(pstr)-steps; 8 strcpy(temp,pstr+n); 9 strcpy(temp+steps,pstr); 10 *(temp+strlen(pstr))='\0'; 11 strcpy(pstr,temp); 12 } 13 void main() 14 { 15 char *p,s[]="123456789"; 16 int steps=2; 17 p=s; 18 loopmove(p,steps); 19 printf("%s\n",p); 20 }
14、5 字符串与子串的若干问题
(1)求一个字符串中连续出现次数最多的子串
(2)输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置。例如“yyabcdabjcabceg”,输出结果应该为abc和3.
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 string s,temp; 7 int i,j,len; 8 unsigned int m,n; 9 cout<<"input the string s:"<<endl; 10 cin>>s; 11 len=s.length(); 12 for(i=len-1;i>=1;i--)//程序中此处i应该为i>=1,这样对于“abca”这样的字符串可以得出子串为:a 1 ;而原书中为i>1,只能得到子串长度大于等于2的子串。。 13 { 14 for(j=0;j<len;j++) 15 { 16 if(i+j<=len) 17 { 18 temp=s.substr(j,i); 19 m=s.find(temp); 20 n=s.rfind(temp); 21 if(m!=n) 22 { 23 cout<<"the longest substring is\n"<<temp<<" "<<m+1<<endl; 24 return 0; 25 } 26 } 27 } 28 } 29 cout<<"cannot find the longest substring"<<endl; 30 return 0; 31 }
(3)写一个函数来模拟C++中的strstr()函数:该函数的返回值是主串中字符子串的位置以后的所有字符。不适用任何C程序已有的函数来完成。
1 //方法一: 2 #include<iostream> 3 using namespace std; 4 #define max 20 5 void strstr1(const char*string,const char*strcharset) 6 { 7 int i=0,j=0,flag=0; 8 while(string[i]!='\0') 9 { 10 while(string[i]!=strcharset[0]) 11 i++; 12 while(strcharset[j]!='\0') 13 { 14 if(string[i++]!=strcharset[j++]) 15 { 16 flag=0; 17 j=0; 18 break; 19 } 20 } 21 if(strcharset[j]=='\0') 22 { 23 flag=1; 24 break; 25 } 26 } 27 if(flag==1) 28 { 29 const char*p=&string[i-j]; 30 cout<<"the substring is: "<<p<<endl; 31 } 32 } 33 void main() 34 { 35 char *p="12345554555123"; 36 char substr[max]; 37 cout<<"please input the substr:"<<endl; 38 cin>>substr; 39 strstr1(p,substr); 40 } 41 //-------------------------------------------------------------------------- 42 方法二: 43 #include<iostream> 44 using namespace std; 45 #define max 20 46 const char* strstr1(const char*string,const char*strcharset) 47 { 48 int i,j,temp; 49 for(i=0;string[i]!='\0';i++) 50 { 51 j=0; 52 temp=i; 53 if(string[i]==strcharset[j]) 54 { 55 while(strcharset[j++]==string[i++]) 56 { 57 if(strcharset[j]=='\0') 58 return(&string[i-j]); 59 } 60 i=temp; 61 } 62 } 63 return (NULL); 64 } 65 void main() 66 { 67 const char *q; 68 char *p="12345554555123"; 69 char substr[max]; 70 cout<<"please input the substr:"<<endl; 71 cin>>substr; 72 q=strstr1(p,substr); 73 cout<<"the substring is: "<<q<<endl; 74 }
(4)实现一个函数将一句话里的单词进行倒置,标点符号不倒换。比如一句话“i come from wuhan.“倒置后变成"wuhan. from come i"。
1 #include<stdio.h> 2 #include<string.h> 3 #define max 100 4 void main() 5 { 6 int i,j=0,len,m=0,n=0; 7 char charstr[max]="welcome to china.",temp; 8 9 len=strlen(charstr); 10 for(i=0;i<len/2;i++) 11 { 12 temp=charstr[i]; 13 charstr[i]=charstr[len-1-i]; 14 charstr[len-1-i]=temp; 15 } 16 printf("after 1th inverse: %s\n",charstr); 17 18 while(charstr[j]!='\0') 19 { 20 if(charstr[j]!=' ') 21 { 22 m=j; 23 while(charstr[j]!='\0' && charstr[j]!=' ') 24 j++; 25 n=j-1; 26 } 27 while(n>m) 28 { 29 temp=charstr[m]; 30 charstr[m]=charstr[n]; 31 charstr[n]=temp; 32 m++; 33 n--; 34 } 35 j++; 36 } 37 printf("after 2th inverse: %s\n",charstr); 38 }
(5)写一个函数,计算4 000 000 000以内的最大的那个f(n)=n的值,函数f的功能是统计所有0到n之间所有含有数字1的数字和。
比如f(13)=6
因为1在1,2,3,4,5,6,7,8,9,10,11,12,13中的总数是6(1,11,12,13)
(6)转换字符串格式为原来字符串的字符+该字符出现的个数,例如字符串1233422222,转化为1121324125.
主要收获是sprintf函数的使用:http://baike.baidu.com/view/1295144.htm
1 #include<stdio.h> 2 #include<string.h> 3 #define max 100 4 void main() 5 { 6 int i,len,offset=0,count=1; 7 char str[max]; 8 char temp[max]; 9 printf("please input the string"); 10 scanf("%s",str); 11 len=strlen(str); 12 for(i=0;i<len;i++) 13 { 14 if(str[i+1]==str[i]) 15 { 16 count++; 17 } 18 else 19 { 20 offset+=sprintf(temp+offset,"%c%d",str[i],count); 21 count=1; 22 } 23 } 24 temp[offset]='\0'; 25 printf("the result is: %s",temp); 26 }