目录
一、前言
字符类型数据是我们常用的数据类型,比如姓名、籍贯、描述信息等等,为此,我们需要掌握一些常用的字符串操作。
二、常用操作
长度计算、复制、替换、删除、插入、比较、子串、分割、匹配、合并
三、常用操作实现
-
长度
#include<stdio.h>
int Strlen(char *s){
int i;
for(i=0;s[i] !='\0';) //字符数组中没有存储数据的地方为 '\0'
i++;
return i;
}
int main(){
char string[10];
int length;
gets(string);//原型 char * gets ( char * str )
length=Strlen(string);
printf("%d\n",length);
return 0;
}
-
复制
#include"stdio.h"
char *strcpy(char *s1,char *s2)
{
int i;
for(i=0;s2[i]!='\0';i++)
s1[i]=s2[i];
s1[i]='\0';
return s1;
}
void main()
{
char string[50];
char copystring[50];
printf("\nPlease input string:");
gets(string);
strcpy(copystring,string);
printf("\nString:%s",string);
printf("\nCopystring:%s",copystring);
}
-
替换
#include"stdio.h"
char *strrep(char *s1,char *s2,int pos)
{
int i,j;
pos--;
i=0;
for(j=pos;s1[j]!='\0';j++)
if(s2[i]!='\0')
{
s1[j]=s2[i];
i++;
}
else
break;
return s1;
}
void main()
{
char string1[100];
char string2[50];
int position;
printf("\nPlease input original string:");
gets(string1);
printf("\nPlease input substitute string:");
gets(string2);
printf("\nPlease input substitute position:");
scanf("%d",&position);
strrep(string1,string2,position);
printf("\nThe final string:%s\n",string1);
}
-
删除
#include"stdio.h"
char *strdel(char *s,int pos,int len)
{
int i;
pos--;
for(i=pos+len;s[i]!='\0';i++)
s[i-len]=s[i];
s[i-len]='\0';
return s;
}
void main()
{
char string[50];
int position;
int length;
printf("\nPlease input original string:");
gets(string);
printf("\nPlease input delete position:");
scanf("%d",&position);
printf("\nPlease input delete length:");
scanf("%d",&length);
strdel(string,position,length);
printf("\nThe final string:%s",string);
}
-
插入
#include "stdio.h"
#include <string.h>
#define MAX_SIZE 100
void insert (char *s, char *t, int i)
{
char string[MAX_SIZE], *temp =string;
if ( i < 0||i > strlen (s) )
{
printf ( "插入位置不正确!\n");
exit (1);
}
if (!strlen (s))
strcpy (s, t);
else if (strlen (t)) {
strncpy (temp, s, i);
strcat (temp, t) ;
strcat (temp, (s + i ));
strcpy (s, temp );
}
}
int main ()
{
char s[]="Sitplease.";
char t[]=" down ";
insert(s,t,-1);//将t从s的下标为3的位置开始插入到s中
printf("%s",s);
printf ( "\n");
return 0;
}
-
比较
#include"stdio.h"
int strcmp(char *s1,char *s2)
{
int i,j;
for(i=0;s1[i]==s2[i];i++)
if(s1[i]=='\0'&&s2[i]=='\0')
return 0;
if(s1[i]>s2[i])
return 1;
return -1;
}
void main()
{
char s1[50];
char s2[50];
int compare;
printf("\nPlease input string(1):");
gets(s1);
printf("\nPlease input string(2):");
gets(s2);
compare=strcmp(s1,s2);
printf("\nString(1):%s",s1);
printf("\nString(2):%s",s2);
printf("\nCompare result:");
switch(compare)
{
case 0:
printf("\nString(1)=String(2)\n");
break;
case 1:
printf("\nString(1)>String(2)\n");
break;
case -1:
printf("\nString(1)<String(2)\n");
break;
}
}
-
子串
#include"stdio.h"
char *substr(char *s,int pos,int len)
{
char s1[50];
int i,j,endpos;
pos--;
endpos=pos+len-1;
for(i=pos,j=0;i<=endpos;i++,j++)
s1[j]=s[i];
s1[len]='\0';
printf("\nThe substring is '%s'\n",s1);
return s1;
}
int main()
{
char string[100];
char *substring;
int position;
int length;
printf("\nPlease input string:");
gets(string);
printf("Please input start position:");
scanf("%d",&position);
printf("Please input substring length:");
scanf("%d",&length);
substring=substr(string,position,length);
printf("\n%s",substring);
return 0;
}
-
分割
#include"stdio.h"
int partition(char *s1,char *s2,int pos)//pos记录上一次分割到的位置
{
int i,j;
i=pos;
while(s1[i]==' ')//如果遇到空格就跳过
i++;
if(s1[i]!='\0')
{
j=0;
while(s1[i]!='\0'&&s1[i]!=' ')
{
s2[j]=s1[i];
i++;
j++;
}
s2[j]='\0';
return i;//返回上次分割结束的位置
}
else
return -1;
}
int main()
{
char string[50];
char partition_string[20];
int position;
int k;
printf("\nPlease input strng:");
gets(string);
position=0;
printf("\nPartition result:\n");
k=0;
while((position=partition(string,partition_string,position))!=-1)
{
k++;
printf("Partition %d:%s\n",k,partition_string);
}
return 0;
}
-
匹配
#include "stdio.h"
#include <string.h>
int nfind ( char *B, char *A )
{
int i, j, start = 0;
int lasts = strlen (B)-1;
int lastp = strlen (A)-1 ;
int endmatch = lastp;
for(i=0;endmatch<=lasts;endmatch++,start++)
{
if ( B[endmatch] == A[lastp])//如果最后一位匹配,那么开始从头遍历判断是否匹配
for (j=0,i=start;j<lastp&&B[i]==A[j];)
i++,j++;
if ( j == lastp )
return (start+1); /*成功 */
}
/*printf("%d %d %d",lasts,lastp,start); */
if(start==0)
return -1;
}
void main ()
{
char s[]="Sit please";
char t[]="please";
int po=nfind(s,t);
printf("%d",po);
printf("\n");
}
-
合并
#include "stdio.h"
#include <string.h>
void strcat(char *des,char *sour)
{
int end=strlen(des);
int i,j,num;
num=strlen(sour);
char res[num+end];
strcpy(res,des);
for(i=end,j=0;j<num;i++,j++)
res[i]=sour[j];
for(i=0;i<end+num;i++)
printf("%c",res[i]);
printf("\n");
}
void main ()
{
char s[]="Sit down";
char t[]=" please!";
strcat(s,t);
}
四、总结:
这部分很重要,为以后的链表操作打下基础,需要熟练掌握