字符数组处理(习题)

数组的定义:

    数组的存储空间长度: 长度*sizeof(类型)

    第i个元素的地址:首地址+(n-1)*sizeof(类型)   n代表第n个元素

#include<stdio.h>
void main()
{
//定义数组:初始化部分值,没有被初始化的值为0
	int buf[10]={1};
	int buf1[5]={1,2,3,4,5};
//引用数组:
	printf("%d %d\n",buf[0],buf[1]);	
//数组长度:
	printf("%d\n",sizeof(buf1)/sizeof(int));
	printf("%d\n",sizeof(buf)/sizeof(int));
}


定义字符数组:

#include<stdio.h>

void main(string.r)
{
//定义数组:并初始化
	char name[10] = "abcdefgh";
//数组的空间长度:
	printf("%d\n",sizeof(name));
//引用元素:下标法
	printf("%c\n",name[2]);
	int i =0;
	for(i=0;name[i]!='\0';i++)
	{
		printf("%c",name[i]);
	}
	printf("\n%s\n",name);
//统计字符串中字符数量:
	i=0;
	while(name[i++]!='\0');
	printf("%d\n",i-1);
//求字符串的长度API:
	printf("%d\n",strlen(name));
}

冒泡排序:

    两两相邻的互比较,直到所有元素比较完成。   

#include<stdio.h>
void main()
{
//定义数组:
	int buf[10]={15,10,2,-9,3,8,14,6,5,7};
//升序:从小到大
	int i=0,j=0,x;
	int temp;
	for(i=0;i<10;i++)	//需要互相比较(第i时刻)
	{
		//两两相邻进行比较  0-1  1-2 2-3 3-4  8-9
		for(j=0;j<10-i-1;j++) //第i时时,两两相邻的元素比较
		{
			if(buf[j]<buf[j+1])//大在后,小的在前
			{
				//互相位置
				temp=buf[j];
				buf[j]=buf[j+1];
				buf[j+1]=temp;			
			}	
		}
	}
//打印:
	for(i=0;i<10;i++)
	{
		printf("%d ",buf[i]);
	}
	printf("\n");
}

        主要是已经排列出来了最大值,如果  j<10  的话 , 那么最大值就会被重复排列 , 造成代码复用.

冒泡加强的健壮性:

#include<stdio.h>

int main()
{
	int buf[100] = {15,10,32,44,31,23,11,2,-9,3,8,14,6,5,7};
	//int len = (sizeof(buf))/4;
	int i = 0,j = 0,temp;
	int len;
	while(buf[i++]!='\0')
	{
		len = i;
	}
	
	for(i=0;i<len;i++)
	{
		for(j=0;j<len-i-1;j++)
		{
			if(buf[j]>buf[j+1])
			{
				temp = buf[j];
				buf[j] = buf[j+1];
				buf[j+1] = temp;
			}
		}
	}
	for(i=0;i<len;i++)
	{
		printf("%d",buf[i]);
	}
}


插入排序 :

        将元素分为两堆(已排序/未排序),每次从未排序中取出第一个元素插入到已排序队列中 。

#include<stdio.h>
void main()
{
	int A[6]={5,2,4,6,1,3};
	int i,j,key;
	for(j=1;j<6;j++)
	{
		key=A[j];//从右侧牌堆中抓一张key牌,key牌即手中抓的将要插入的牌
		i=j-1;//与key牌左侧第一张牌比较
		while((i>=0)&&(A[i]>key))//一直比较,将较小的牌移至左侧
		{
			A[i+1]=A[i];
			i=i-1;
		}//key牌此时一直在手中,未插入
		A[i+1]=key;//插入key牌
	}
	for(i=0;i<6;i++)
	{
		printf("%d\n",A[i]);
	}
}


字符串以  '\0'  结束:

    空字符:ASCII -0  '\0'   约定:每个字符串后面都加一个结束字符.

    一般约定的字符串的结尾会以一个  '\0'  的符号结束.

#include<stdio.h>
#include<string.h>

void main()
{
//定义数组 :并初始化
	char name[100]="abc\0defg";	//'\0'
//数组的空间长度:
	printf("%d\n",sizeof(name));
//引用元素:下标法(0)
	printf("%c\n",name[2]);
	int i=0;
	for(i=0;name[i]!='\0';i++)//name[6]=='0'
	{
		printf("%c",name[i]);
	}
	printf("\n%s\n",name);	//%c字符 %s字符串
}

但是不添加  '\0'  的话.


    当 char name[6] = { 'a','b','c','d','f' }; 时,就会刚刚好结尾有 '\0' .

    出现越界的状况 , 是 char name[5] = { 'a','b','c','d','f' };  时,就会打印一个乱码 .

#include<stdio.h>
#include<string.h>

void main()
{
//定义数组 :并初始化
	//char name[100]="abc\0defg";	//'\0'
	char name[6]={'a','b','c','d','f'};
//数组的空间长度:
	printf("%d\n",sizeof(name));
//引用元素:下标法(0)
	printf("%c\n",name[2]);
	printf("\n%s\n",name);	//%c字符 %s字符串
}

    出现乱码的情况 , 是因为没有给他添加 '\0' 造成的.


统计字符串中字符数量:

#include<stdio.h>
#include<string.h>

void main()
{
//定义数组 :并初始化
	char name[100]="abc\0defg";	//'\0'
//统计字符串中字符数量:
	i=0;
	while(name[i++]!='\0') ;
	printf("%d\n",i-1);
//求字符串的长度API:
	printf("%d\n",strlen(name));
}

连接字符串:

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[20]="abc";
	char buf1[10]="def";
/*
//连接字符串:将buf1的内容连接到buf后面  abcdef
	//1找到buf的结束 字符
	int i=0,j=0;
	while(buf[i++]!='\0');//4
	//粘贴
	while( '\0'!=(buf[i++-1]=buf1[j++]) );
	printf("%s\n",buf);
*/      //API的使用
	strcat(buf,buf1);		
	printf("%s\n",buf);
}


习题:

        char buf[100]="";

        char name[10]="abcd";

        将name复制给buf

第一种:

#include<stdio.h>
void main()
{
//复制操作
	char buf[100]="";
	char name[10]="abcd";
//连接字符串:将buf1的内容连接到buf后面 abcdef
//1找到buf的结束  字符
	int i=0,j=0;
	while(buf[i++]!='\0');
	while('\0'!=(buf[i++-1]=name[j++]));
	printf("%s\n",buf);
}

或者简洁点:

#include<stdio.h>
void main()
{
//两个字符串:
	char buf[100]="";
	char buf1[10]="hello";
//怎么样将子字符串复制给buf	
	int i=0;
	while('\0'!=(buf[i]=buf1[i]))i++;
	printf("%s\n",buf);
}

使用API的方法:

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[10]="";
	char buf1[]="name";
//函数:将buf1复制给buf
	strcpy(buf,buf1);
	printf("%s\n",buf);
}


习题:

    将所有字符串转换成大写的字符,将下列字符串转换成为大写字符:

    char buf[100]="aFDsfdsDE3432d";

    第一种:

#include<stdio.h>
void main()
{
	char num[100] = "aFDsfdsDe3432d";
	int i = 0;
	for(;num[i]!='\0';i++)
	{
		if(num[i]>=97)
		{
			num[i]-=32;
		}
	}
	printf("%s",num);
}

    Or  :

#include<stdio.h>
void main()
{
	char buf[]="ab3D45#EDdfsae3d432eerSDFSDwiuDDE";
	int i=0;
	while(buf[i]!='\0')
	{
		if(buf[i]>='a' && buf[i]<='z')//小-》大写
			buf[i]-=32;
		i++;
	}		
	printf("%s\n",buf);
}


习题:

    将下列字符串的字符数转换为成整型值

    char num[10]="123a"; //123

#include<stdio.h>
void main()
{
	char num[]="123";
	//遇到字符,则停止转换
	//printf("%d\n",atoi(num));        //使用API进行转换
	int i=0;
	int result=0;
	while(num[i]!='\0' && num[i]>='0'&& num[i]<='9' )
	{
		result*=10;	//12*10+  3
		result+=num[i]-48;		//ASCII '1'-49
		i++;
	}
	printf("%d\n",result);
}


习题:

    比较两个字符串是否相等

            char buf[10]="abc";

            char buf1[20]="abc";

        相等  buf>buf1   buf<buf1

    第一次判断:

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[]="hello";
	char buf1[]="hellz";
	int a = 11;
	int b = 2;
	if(a>b)
	{
		printf("a>b\n");
	}
	int i = 0;
	int result=0;
	while(buf[i]!='\0' && buf1[i]!='\0')
	{
	if(buf[i]>buf1[i])
	{
		printf("buf>buf1\n");
	}
	else if(buf[i]<buf1[i])
	{
		printf("buf<buf1\n");
	}
	else if(i=strlen(buf)-1)
		printf("buf=buf1\n");
	i++;
	}
}

    第二次判断:

输出了  buf==buf1  的结果,是因为在 while 的  buf[i]!='\0' && buf1[i]!='\0'  的判断中已经判断到  '\0'  的了,就跳出了while的循环,所以会输出  buf==buf1 .

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[]="hel";    //此时比较的话,还是会输出  buf==buf1  的结果.
	char buf1[]="hellz";
	int a = 11;
	int b = 2;
	if(a>b)
	{ 
		printf("a>b\n");
	}
	int i = 0;
	int result=0;
	while(buf[i]!='\0' && buf1[i]!='\0' && 0==(result=(buf[i]-buf1[i])) )
	i++;
	if(result>0)
		printf("buf>buf1\n");
	else if(result==0)
		printf("buf==buf1\n");
	else
		printf("buf<buf1\n");
}

    改进判断:

    修改条件  :  while( 0==(result=(buf[i]-buf1[i])) && buf1[i]!='\0' && buf[i]!='\0' )

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[]="hello";        //将会输出  buf<buf1,因为修改了while里面的条件.
	char buf1[]="hel";         // hel \0  ,当 hello - hel\0 
	int a = 11;
	int b = 2;
	if(a>b)
	{ 
		printf("a>b\n");
	}
	int i = 0;
	int result=0;
	while( 0==(result=(buf[i]-buf1[i])) && buf1[i]!='\0' && buf[i]!='\0' )
	i++;
	if(result>0)
		printf("buf>buf1\n");
	else if(result==0)
		printf("buf==buf1\n");
	else
		printf("buf<buf1\n");
}

    继续改进判断:

如果 buf = buf1 的时候  hello\0   和   hello\0  .

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[]="hello\0";    //     hell\0     h e l l \0
	char buf1[]="hello\0";   //     hello\0    h e l l  o \0   上面减去下面,当 \0-o 时 while(0==(result=(buf[i]-buf1[i])) && buf[i]!='\0' && buf1[i]!='\0') 时只需要判断buf[i]!='\0' 这个条件.
	int a = 11;
	int b = 2;
	if(a>b)
	{ 
		printf("a>b\n");
	}
	int i = 0;
	int result=0;
	while( 0==(result=(buf[i]-buf1[i])) && buf[i]!='\0' )   //所以只用判断 buf[i]!='\0' 就ok.
	i++;
	if(result>0)
		printf("buf>buf1\n");
	else if(result==0)
		printf("buf==buf1\n");
	else
		printf("buf<buf1\n");
}

    使用API完成判断.

#include<stdio.h>
#include<string.h>

void main()
{
	char buf[]="hel";
	char buf1[]="hellz";
	int a = 11;
	int b = 2;
	if(a>b)
	{ 
		printf("a>b\n");
	}
	int i = 0;
	int result=0;
	//while( 0==(result=(buf[i]-buf1[i])) && buf1[i]!='\0' && buf[i]!='\0' )
	//i++;
	result = strcmp(buf,buf1);    //buf<buf1 :<0  buf=buf1 :=0  buf>buf1 :>0
	if(result>0)
		printf("buf>buf1\n");
	else if(result==0)
		printf("buf==buf1\n");
	else
		printf("buf<buf1\n");
}


习题:

    查找子字符串:

          如  :  "abcdefgabcflifaiafdaelifaalifeiafdasfe"

          查找  :  "lifei"

    特别傻的一种方法.

#include<stdio.h>

void main()
{

	char cha[100] = "abcdefgabcflifaiafdealifeiafdasfe";
	int i = 0,j = 0;
	for(;cha[i]!='\0';i++)
	{
		if(cha[i]='l')
		{
			if(cha[i+1]='i')
			{
				if(cha[i+2]='f')
				{
					if(cha[i+3]='e')
					{
						if(cha[i+4]='i')
						{
							printf("存在lifei");
							break;
						}
					}
				}
			}
		}
	}
	return ;
}


习题:

     将下列数组中的大写字符排在前列,小写字符排在紧挨大写字符后面;

     char buf[]={"AfdSFDsSdfDSSD"};

#include<stdio.h>

void main()
{
	char buf[]={"AfdSFDsSdfDSSD"};
	int i = 0;
	for(;buf[i]!='\0';i++)
	{
		if(buf[i]>='A'&&buf[i]<='Z')
		{
			printf("%c",buf[i]);
		}
	}
	for(i=0;buf[i]!='\0';i++)
	{
		if(buf[i]>='a'&&buf[i]<='z')
		{
			printf("%c",buf[i]);
		}
	}
	//打印出 : ASFDSDSSDfdsdf
}


习题:

        统计下列数组中单词的数量:

        char buf[]="I love china ";  (单词以空格分隔).

        还需该进,如果开头有空格,或者结尾有空格就不行.

#include<stdio.h>

void main()
{
	char buf[]="I Love China";
	int i = 0;
	int a = 0;
	for(;buf[i]!='\0';i++)
	{
		if(buf[i]==32 && buf[i+1]!=32 && buf[0]!=32)
		{
				a = a +1;
		}
		else if(buf[0]==32 && buf[i]==32 && buf[i+1]!=32)
		{
			a = a+1;
		}
		else if(buf[0]!=32 && buf[i]==32 && buf[i+1]!=32 && buf[13]==32)
		{
			a = a+1-1;
		}
	}
	printf("单词数量%d",a+1);
}

猜你喜欢

转载自blog.csdn.net/Superman___007/article/details/81024200