第八章字符串
8.1字符串的定义与初始化
1.用字符数组初始化
//1.用字符数组初始化
int main()
{
char ch[12];
char ch2[12]=
{'H','e','l','l','o',',','W','o','r','l','d','!'};
//如果元素的个数小于字符串长度后面会自动初始化
空字符'\0'
char ch3[12]={'H','e','l','l','o'};
//同样可以缺省数组长度
char ch4[]=
{'H','e','l','l','o',',','W','o','r','l','d','!'};
ch[0]='H';
ch[1]='e';
ch[2]='l';
ch[3]='l';
ch[4]='o';
ch[5]=',';
ch[6]='W';
ch[7]='o';
ch[8]='r';
ch[9]='l';
ch[10]='d';
ch[11]='!';
printf("ch:%s\nch2:%s\nch3:%s\nch4:%s
\n",ch,ch2,ch3,ch4);
}
//令人不解的是ch4为什么会多出一个hello来
运行结果:
2.用字符串常量初始化
#include<stdio.h>
void main()
{
char ch1[14]={"Programing!"};
char ch2[14]="Programing!";
char ch3[]={"Programing!"};
char ch4[]="Programing!";
printf("ch1:%s\nch2:%s\nch3:%s\nch4:%s
\n",ch1,ch2,ch3,ch4);
}
运行结果:
3.字符数组和字符串的区别
两者不是同一个概念,只是在C语言中,用字符数组来处理字符串
void main()
{
int i;
char ch[12]={'H','e','l','l','o',',','W','o','r','l','d','!'};
//这样打印会出错
printf("ch:%s\n",ch);
for(i=0;i<12;i++)
printf("%c",ch[i]);
printf("\n");
}
运行结果:
8.2字符串的常用操作
8.2.1字符串的输入输出
方法1:用%c逐字输入/输出
void main()
{
int i;
char ch[12];
for(i=0;i<12;i++)
scanf("%c",&ch[i]);
for(i=0;i<12;i++)
printf("%c",ch[i]);
printf("\n");
}
输入Hello,World!
运行结果:
方法2:用%s整体输入/输出
void main()
{
char str_a[10],str_b[10];
scanf("%s%s",str_a,str_b);
printf("%s\t%s \n",str_a,str_b);
}
输入 How are you运行结果
提示:用%s的形式输入字符串时,字符串中不能出现空格,回车符和制表符,因为它们都是scanf默认的输入分隔符
3.用系统提供的gets和puts函数
void main()
{
char str_a[10];
gets(str_a);
puts(str_a);
}
输入 How are you运行结果:
8.2.2指向字符串的指针
/根据字符串的首地址来引用一个字符串,这样的指针称为字符串指针
void main()
{
char *ps;
ps="Programing!";
puts(ps);
ps="Hello,World!";
puts(ps);
}
运行结果:
注意:ch1是指针常量,不可以这样赋值
char ch1[14]={“Hello World!”};
ch1=Programing!";
Example8.2
运用字符串指针遍历字符串,统计字母、空格、数字出现次数
void main()
{
int character=0,digit=0,space=0,other=0;
char *p="Hello!",s[20];
puts(p);
p=s;
printf("input string:\n");
gets(p);
while(*p!='\0')
{
if(('A'<=*p && *p<='Z') ||('a'<=*p && *p<='z'))
++character;
else if(*p==' ')
++space;
else if((*p<='9')&&(*p>='0'))
++digit;
else ++other;
p++;
}
printf("character:%d\nspace:%d\ndigit:%d\nother:%d\n",character,space,digit,other);
}
运行结果:
Example8.3 利用二维数组读入输出多个字符串
void main()
{
char a[5][7];
int i;
for(i=0;i<5;i++)
gets(a[i]);
for(i=0;i<5;i++)
puts(a[i]);
return 0;
}
输入File<回车>Edit<回车>View<回车>Run<回车>Tools<回车>运行结果
8.2.3字符串处理的常用函数
unsigned int strlen(const char *str);
char *strcpy(char *destination,const char *source);
char *strcat(char *destination,const char *source);
int strcmp(const char *str1,const char *str2);
char *strupr(char *str);
char *strlwr(char *str);
8.3应用举例
8.3.1回文判断
#include<stdio.h>
#include<string.h>
#define MAX 80
int Palindrome(const char *str);
void main()
{
char str[MAX],ch;
do
{
printf("Input a string:\n");
gets(str);
if(Palindrome(str))
printf("It is a palindrome\n");
else
printf("It is not a palidrome\n");
printf("continue?(Y/N)\n");
ch=getchar();
getchar();
}while(ch=='y'||ch=='Y');
}
int Palindrome(const char *str)
{
int i=0,j=strlen(str)-1;
while(i<j)
{
while(str[i]==32)
i++;
while(str[j]==32)
j--;
if(str[j]==str[i])
{
i++;j--;
}
else return 0;
}
return 1;
}
8.3.2统计单词出现次数
#include<stdio.h>
#include<string.h>
int search(const char *ps,const char *pf)
{
int count=0,i=0;
char dest[20];
while(*ps)
{
i=0;
while((*ps>='a' && *ps<='z') || (*ps>='A' && *ps<='Z'))
{
dest[i++]=*ps++;
}
dest[i]='\0';
ps++;
if(strcmp(dest,pf)==0)
count++;
}
return count;
}
void main()
{
char source[200];
char key[15];
puts("Input the source sentence:");
gets(source);
puts("Input the key word:");
gets(key);
printf("There are %d key words in the sentence.\n",search(source,key));
}
运行结果
8.3.3密码问题
#include<stdio.h>
#include<string.h>
int check(char *ps)
{
char passwd[]="LOVEYOU"; //设定密码
int i=0;
int flag=1;
for(;*ps!='\0' && flag;ps++)
{
if(*ps>'a' && *ps<'z')
*ps=*ps-32+2; //解密规则
if(*ps!=passwd[i])
flag=0;
else
i++;
}
return flag;
}
void main()
{
char str[10];
int i=0;
printf("input your password:\n");
while((str[i]=getchar())!='#')
{
i++;
}
str[i]='\0';
if(check(str))
printf("Pass!\n");
else
printf("Error!\n \a \a \a");
}
运行结果:
8.3.4字符串的排序
方法一:用一维数组实现
#include<stdio.h>
#include<string.h>
void sort(char *str[],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0)
k=j;
if(k!=i)
{
temp=str[i];
str[i]=str[k];
str[k]=temp;
}
}
}
void main()
{
char *pstring[4]={"FORTRAN","PASCAL","BASIC","C"};
int i,nNum=4;
sort(pstring,nNum);
for(i=0;i<nNum;i++)
printf("%s\n",pstring[i]);
return 0;
}
运行结果:
方法二:用二维数组实现
#include<stdio.h>
#include<string.h>
void sort(char (*str)[10],int n)
{
char temp[20];
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0)
k=j;
if(k!=i)
{
strcpy(temp,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],temp);
}
}
}
void main()
{
char string[][10]={"FORTRAN","PASCAL","BASIC","C"};
int i,nNum=4;
sort(string,nNum);
for(i=0;i<nNum;i++)
printf("%s\n",string[i]);
}
运行结果:
8.4带参数的main函数
int main(int argc,char **argv)
{
int i;
for(i=1;i<argc;i++)
printf("%8s",argv[i]);
printf("\n");
return 0;
}