C语言程序设计 第八章字符串

第八章字符串

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

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值