您的位置:首页 > 职场人生

C基础语法(二)---复杂数据类型(数组和字符串)

2014-12-19 14:34 609 查看
一、数组

数组的基本概念:数组就是用来存储一组数据的。

使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

素组的特点:只能存放一种数据类型,比如int 类型的数组、float 类型的数组,里面存放的数据称为“元素” 。

1.一维数组

数组的定义格式: 类型 数组名[元素个数]

定义的例子:

int ages[50] = {1,2,3,4,....,50};

ages[1] = 2; //数组元素的访问

int ages[5] = {10,11}; //给前两个元素赋值

int ages[5] = {[3] = 10,[4] = 11}; //给后两个元素赋值

//在c语言中可以不写数组元素的个数

int ages[] = {10,11,14};

//这种写法是可以的,字符与int可以相互转换

int ges['A'] = {10,11,12,13,14};

错误的定义方法:

1.int ages[];

//只能在定义数组的同时进行初始化

2.int ages[5];

ages = {10,11,12,13,14};
//如果想在定义数组的同时进行初始化,数组元素必须放常量

3.int count = 5;

int ages[count] = {1,2,3};

可以改成下面的形式:定义数组和初始化不同时进行

int count = 5;

int ages[count];

ages[0] = 1;

ages[1] = 2;

内存分析:

如何计算数组元素的个数

int ages[] = {10,22,33,44};

int count = sizeof(ages)/sizeof(int)//这就是面向过程

存储空间的划分(内存的分配时是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的) ;

数组名代表数组地址 ;

数组操作常见问题:数组下标越界异常

如 int args[2] = {1,2};

Printf("输出数组的第三个元素:%d",args[2]); 访问到了数组不存在的下标时发生。

数组的其他使用:

数组作为函数参数,可以省略元素个数。

数组作为函数参数,传递的是整个数组的地址,修改函数形参数组元素的值,

会影响到外面的实参数组。

注:将数组名当做函数参数传递时,函数会把数组当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节。所以在函数中不能计算数组元素的个数。

2.数组中的数组

也称多维数组,以二维数组为例。

二维数组是一个特殊的数组:它的元素是一维数组。

初始化方式:

方法一:在定义的同时赋值

int a[3][2] = {0};//所有元素都为0

方法二:常规的赋值方法

int a[3][2]= {1,2,3,4,5,6};

方法三:分行赋值

int a[3][2] = {{1,2},{3,4},{5,6}};

方法四:部分赋值法

int a[3][2] = {{1,2},{0},{5,6}};

方法五:

int a[3][2]; //先定义

for(int i = 0;i<3;i++) //用双重for循环赋值,i 和 j 表示二维数组下标

for(int j = 0;j<2;j++)

scanf("%d",&a[i][j]);

注意错误:

int a[3][2];

a[3] = {};//因为每个元素为一个数组

二、字符串
什么是字符串:
很多个字符组合在一起就是字符串。
'\0' 是字符串结束标志。

字符串的初始化:
char name[8] = "jack";
char name2[8] = {'j','a','c','k','\0'};
char name3[8] = {'j','a','c','k',0};
以上三种方式在在内存中存储方式一样,字符串用数组存储。

char name4[8] = {'j','a','c','k'}; // 会有警告,最好加上‘\0’结束标志
char name5[] = {''j,'a','c','k'}; // 不算一个字符串,只能说是一个字符数组
字符串的输出 "%s" , '\0' 是不会输出的

常用字符串处理函数:
1.strlen函数:计算字符串的长度(不包括字符串结束标志 '\0')。
strlen函数声明在string.h 文件中;
计算的是字符数,并不是字数;
计算的字符不包括 '\0';
从某个地址开始数字符的个数,直到遇到' \0' 为止;

#include"string.h"

main()

{

int k;

static char st[]="C Language";

k=strlen;

printf("The lenth of the string is %d\n",k);

}

2.字符串输出函数 puts 格式:puts(字符数组名) 功能:把字符数组中的字符串输出到显示器。

#include"stdio.h"

main()

{

static char c[]="BASIC\ndBASE";

puts(c);

}

3.字符串输入函数gets 格式:gets(字符数组名) 功能:从标准输入设备上

输入一个字符串。

#include"stdio.h"

main()

{

char st[15];

printf("input string:\n");

gets;

puts;

}

tips:gets函数并不以空格作为字符串输入结束的标志,而只是以回车作为输入结束,这是与scanf不同的部分

4.字符串连接函数strcat 格式:strcat(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串连接到字符数组1中字符串后面,并删去字符串

1后的串标志"\0",本函数返回字符数组1的首地址。

#include"string.h"

main()

{

static char st1[30]="My name is ";

int st2[10];

printf("input your name:\n");

gets(st2);

strcat(st1,st2);

puts(st1);

}

5.字符串拷贝函数strcpy 格式:strcpy(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串拷贝到字符数组1中,串结束标志 "\0"也一同

拷贝,字符数组2也可以是一个字符常量,就相当于把一个字符串赋予一个字符数组

#include"string.h"

main()

{

static char st1[15],st2[]="C Language";

strcpy(st1,st2);

puts(st1);

printf("\n");

}

6.字符串比较函数strcmp格式:strcmp(字符数组1,字符数组2) 功能:

按照ASCII码顺序比较两个数组中的字符串,并有函数返回值返回比较结果

#include"string.h"

main()

{

int k;

static char st1[15],st2[]="C Language";

printf("input a string:\n");

gets(st1);

k=strcmp(st1,st2);

if(k==0) printf("st1=st2\n");

if(k>0) printf("st1>st2\n");

if(k<0) printf("st1<st2\n");

}

三、小练习
数组练习:
/*
随机产生个以内的数,按从小到大的顺序排序输出
思路:冒泡排序法
*/
#include <stdio.h>

int main()
{
//定义一个一维数组
int nums[5];

//请用户输入个以内的整数
printf("请输入个以内的整数,以逗号分隔:");

//用scanf函数接收这些数字
scanf("%d,%d,%d,%d,%d",nums);

//定义第三方变量
int temp ;
//冒泡排序法
for(int i = 0;i < 4;i++)
{
for(int j = i+1; j < 5;j++)
{
if(nums[i] > nums[j])
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}

//遍历数组
for(int i = 0;i < 5;i++)
{
printf("%d",nums[i]);
}
return 0;
}

输入5个数字:5,89,77,99,1
运行结果:1,5,77,89,99

字符串数组:
/*
从键盘输入个字符串(仅仅包含英文字母和数字)
对这个字符串从小到大排列并输出结果。
*/
#include <stdio.h>
#include <string.h>

int main()
{
//定义一个二维数组
char ary[6][20];

//请用户输入字符串
for(int i = 0;i < 6;i++)
{
printf("请输入第%d个字符串,仅仅包括英文字母和数字:",i+1);

scanf("%s",ary[i]);
}

for(int i = 0;i < 5;i++)
{
for(int j = i+1;j < 6;j++)
{
if(strcmp(ary[i],ary[j]) > 0)
{
//定义一个第三方变量
char temp[50];

//将最小值排在前面
strcpy(temp,ary[i]);
strcpy(ary[i],ary[j]);
strcpy(ary[j],temp);
}
}
}

printf("由小到大排序:");

//遍历数组
for(int i = 0;i < 6;i++)
{
printf("%s",array[i]);
}

return 0;
}

字符串操作:
/*
遍历字符串,找到与某个字符相同的字符,就返回,没有就返回
*/

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

int main()
{ //函数的声明
int char_contains(char str[],char c);

int result = char_contains("itcast",'t');

printf("%d",result);

return 0;
}

//定义函数
int char_contains(char str[],char c)
{
int i = -1;
while(str[++i] != c && str[++i] != '/0');

return str[i] == c ? 0 : 1;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员