数组的定义:
数组的存储空间长度: 长度*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);
}