以前常用的一些字符串处理函数这篇文中都包括了,很有用,所以转载了。文章转自:http://www.cnblogs.com/lpshou/archive/2012/06/05/2536799.html
整数字符串的转化
1、直接采用现有函数
(1)直接采用itoa实现整数到字符串的转换
函数形式为: char *itoa(int value, char *string, int radix);
该函数包含在头文件stdlib.h中。int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等。
具体实现为:
#include<stdlib.h> #include<stdio.h> void main() { int a=123; char string[10]; itoa(a,string,10); printf("整数:%d\n字符串:%s",a,string); }
2)直接采用atoi实现字符串到整数的转换
函数形式为: int atoi(const char *nptr);
#include<stdlib.h> #include<stdio.h> void main() { int a; char string[10]="123"; a=atoi(string); printf("转换后的整数:%d",a); }
2、不采用现有的itoa和atoi函数
(1)整数到字符串的转换
具体实现为:
#include<stdlib.h> #include<stdio.h> void main() { int i,j=0,a=123456; char temp[10],string[10]; while(a) { i=a%10+'0'; temp[j++]=i; a=a/10; } i=0; j--; while(j>=0) string[i++]=temp[j--]; string[i]='\0'; printf("转换成的字符串为:%s",string); }
(2)字符串到整数的转换
具体实现为:
#include<stdlib.h> #include<stdio.h> #include<string> void main() { char temp[10],string[10]="123456"; int i=0,j,a=0; strcpy(temp,string); while(temp[i]) { a=a*10+(temp[i]-'0'); i++; } printf("转换为整数:%d",a); }
14、2 字符数组和strcpy
(1)面试题1
strcpy字符串拷贝函数的实现
strcpy的原型为:char*strcpy(char *strDest,const char *strSrc)
具体实现为:
#include<stdlib.h> #include<stdio.h> char *strcpy1(char *strDest,char *strSrc) { char *temp=strDest; while((*strDest=*strSrc)!='\0') { strDest++; strSrc++; } return temp; } void main() { char str[]="123iamhappy!"; char strDest[50]; strcpy1(strDest,str); printf("最终的结果为:%s\n",strDest); }
(2)面试题3
编写一个函数,把一个char组成的字符串循环右移n位
具体实现为:
方法1:自己实现的
//(1)形参和实参均为数组名 #include<stdio.h> #include<string.h> void loopmove(char temp[],int n) { int i=0,j,len; char c; len=strlen(temp); for(i=0;i<n;i++) { c=temp[len-1]; for(j=len-2;j>=0;j--) temp[j+1]=temp[j]; temp[0]=c; } } void main() { char s[]="123456789"; int steps=2; loopmove(s,steps); printf("%s\n",s); } //-------------------------------------------------------------------------- //(2)形参为指针变量,实参为数组名 #include<stdio.h> #include<string.h> void loopmove(char *p,int n) { int i,j,len; char *q, temp; len=strlen(p); printf("%d\n",len); for(i=0;i<n;i++) { q=p; temp=*(p+len-1); for(j=len-2;j>=0;j--) { *(p+j+1)=*(p+j); } *p=temp; } } void main() { char s[]="123456789"; int steps=2; loopmove(s,steps); printf("%s\n",s); } //-------------------------------------------------------------------------- (3)//形参为指针变量,实参也为指针变量 #include<stdio.h> #include<string.h> void loopmove(char *p,int n) { int i,j,len; char *q, temp; len=strlen(p); // printf("%d\n",len); for(i=0;i<n;i++) { q=p; temp=*(p+len-1); for(j=len-2;j>=0;j--) { *(p+j+1)=*(p+j); } *p=temp; } } void main() { char *p,s[]="123456789"; int steps=2; p=s; loopmove(p,steps); printf("%s\n",p); } //------------------------------------------------------------------------ (4)//形参为数组名,实参为指针变量 #include<stdio.h> #include<string.h> void loopmove(char temp[],int n) { int i=0,j,len; char c; len=strlen(temp); for(i=0;i<n;i++) { c=temp[len-1]; for(j=len-2;j>=0;j--) temp[j+1]=temp[j]; temp[0]=c; } } void main() { char *p,s[]="123456789"; int steps=2; p=s; loopmove(p,steps); printf("%s\n",p); }
#include<stdio.h> #include<string.h> #define max 100 void loopmove(char*pstr,int steps) { char temp[max]; int n=strlen(pstr)-steps; strcpy(temp,pstr+n); strcpy(temp+steps,pstr); *(temp+strlen(pstr))='\0'; strcpy(pstr,temp); } void main() { char *p,s[]="123456789"; int steps=2; p=s; loopmove(p,steps); printf("%s\n",p); }
14、5 字符串与子串的若干问题
(1)求一个字符串中连续出现次数最多的子串
2)输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置。例如“yyabcdabjcabceg”,输出结果应该为abc和3.
#include<iostream> #include<string> using namespace std; int main() { string s,temp; int i,j,len; unsigned int m,n; cout<<"input the string s:"<<endl; cin>>s; len=s.length(); for(i=len-1;i>=1;i--)//程序中此处i应该为i>=1,这样对于“abca”这样的字符串可以得出子串为:a 1 ;而原书中为i>1,只能得到子串长度大于等于2的子串。。 { for(j=0;j<len;j++) { if(i+j<=len) { temp=s.substr(j,i); m=s.find(temp); n=s.rfind(temp); if(m!=n) { cout<<"the longest substring is\n"<<temp<<" "<<m+1<<endl; return 0; } } } } cout<<"cannot find the longest substring"<<endl; return 0; }
//方法一: #include<iostream> using namespace std; #define max 20 void strstr1(const char*string,const char*strcharset) { int i=0,j=0,flag=0; while(string[i]!='\0') { while(string[i]!=strcharset[0]) i++; while(strcharset[j]!='\0') { if(string[i++]!=strcharset[j++]) { flag=0; j=0; break; } } if(strcharset[j]=='\0') { flag=1; break; } } if(flag==1) { const char*p=&string[i-j]; cout<<"the substring is: "<<p<<endl; } } void main() { char *p="12345554555123"; char substr[max]; cout<<"please input the substr:"<<endl; cin>>substr; strstr1(p,substr); } //-------------------------------------------------------------------------- 方法二: #include<iostream> using namespace std; #define max 20 const char* strstr1(const char*string,const char*strcharset) { int i,j,temp; for(i=0;string[i]!='\0';i++) { j=0; temp=i; if(string[i]==strcharset[j]) { while(strcharset[j++]==string[i++]) { if(strcharset[j]=='\0') return(&string[i-j]); } i=temp; } } return (NULL); } void main() { const char *q; char *p="12345554555123"; char substr[max]; cout<<"please input the substr:"<<endl; cin>>substr; q=strstr1(p,substr); cout<<"the substring is: "<<q<<endl; }
#include<stdio.h> #include<string.h> #define max 100 void main() { int i,j=0,len,m=0,n=0; char charstr[max]="welcome to china.",temp; len=strlen(charstr); for(i=0;i<len/2;i++) { temp=charstr[i]; charstr[i]=charstr[len-1-i]; charstr[len-1-i]=temp; } printf("after 1th inverse: %s\n",charstr); while(charstr[j]!='\0') { if(charstr[j]!=' ') { m=j; while(charstr[j]!='\0' && charstr[j]!=' ') j++; n=j-1; } while(n>m) { temp=charstr[m]; charstr[m]=charstr[n]; charstr[n]=temp; m++; n--; } j++; } printf("after 2th inverse: %s\n",charstr); }
(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
#include<stdio.h> #include<string.h> #define max 100 void main() { int i,len,offset=0,count=1; char str[max]; char temp[max]; printf("please input the string"); scanf("%s",str); len=strlen(str); for(i=0;i<len;i++) { if(str[i+1]==str[i]) { count++; } else { offset+=sprintf(temp+offset,"%c%d",str[i],count); count=1; } } temp[offset]='\0'; printf("the result is: %s",temp); }