Linux编程之c语言数组
1、一:数组的定义:
方法一:
2、方法二:
3、方法三:
4、二:数组的使用
方法一:
5、方法二:
6、三 : 可变数组
在编译程序的时候, 还不知道数组的元素个数,但是是确定数组类型和数组名,此时不能给可变数组赋初值;
直到程序运行到代码定义数组的语句之前,元素的个数才被确定下来
int length ;
scanf("%d", &length); 在运行到可变数组定义前,必须得到数组的元素个数
int array[length] ;// order~
7、四: 字符数组
由char 类型的数据组成的数组
char arr[10] ;
char arr[10] = “hello”;
char arr[10] = {‘h’, ’e’, ’l’, ’l’, ’o’, ‘\0’ , 0, 0, 0, 0} ;
char array[10] = {‘h’, ’e’, ’l’, ’l’, ’o’, ‘a’ , ‘b’, ‘c’, ‘d’, ‘e’} ; // 定义是没有问题的,
这个array不适合当成字符串来做操作了,一般是逐个元素的访问
{1,2,3,4,5,6,7,8,9,10};
‘\0’是“ ”自带的, 通常我们需要对字符数组进行整体操作的时候, 会用上’\0’
我们通常习惯字符串后面的自带’\0’
char a[ ] = “hello” ; 这个字符数组一共占用了6个 ‘h’, ’e’, ’l’, ’l’, ’o’, ‘\0’
char a[ ] = {‘h’, ’e’, ’l’, ’l’, ’o’} ; 这个字符数组一共占用了5个
练习: 使用键盘给字符数组赋值%s,且把每个字符数组的元素都用%c逐个打印出来,
需要用空格隔开
char arr[100]; // random
int i;
scanf("%s" , arr) ;//scanf("%s", &arr[0])
// for(i=0; i<100 ; i++)
for(i=0; arr[i]!='\0' ;i++)// 类似%s 只要在内存中遇到了’\0’就停止打印
{
printf("%c", arr[i]); // 只会显示有效字符
}
scanf("%s" , arr);
等价于scanf("%s" , &arr[0]);
把键盘缓冲区中的字符依次放在数组arr的首元素开始的空间,
直到遇到空格或者换行符停止, 同时增加一个"\0"
如果要输入带空格的字符串,可以用scanf(“%[^\n]” , arr);
或者是 fgets(arr , 100 , stdin);
scanf("%c" , &arr[0]);
只是放置一个字符到首元素地址
printf("%s" , arr);
等价于printf("%s" , &arr[0]);
从地址&arr[0]开始逐个取字符并打印,遇到了‘\0’就停止打印
printf("%c" , arr[i])
打印对应的一个字符
sizeof(arr) 表示整个数组的占用空间字节数
strlen(arr) 函数,可以返回数组的有效字符数,也就是基于arr到‘\0’为止
练习:从键盘输入一个可变长度字符串, 统计这个字符串中小写字母的个数
且把每个小写字母都打印出来
参考 var_array.c 定义可变长度字符串
char_array3.c
******************
字符数组 %c通过下标逐个操作元素,
%s是访问数组名,基于首元素地址开始操作数组
******************
错误~:
char_array3.c:13:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
‘%s’这个格式需要的类型是char *(char类型数据的地址),但是第二个参数是int类型数据的地址
8、扩展:
五:函数 function
1)函数的定义:
函数的作用域 函数的返回值 函数名( 形参类别及形参名列表 )
{
具体的功能实现
}
int func1( char a )
{ ...........
return -1;
}
func1的返回值是int 类型的,调用的时候需要给一个char类型的数
int func2( int x , int y )
{ ...........
return 2;
}
func2的返回值是int 类型的,调用的时候需要给2个int类型的数
int func3( void )
{ ...........
return 1;
}
func3的返回值是int 类型的,调用的时候不需要给参数
void func4( int a )
{ ...........
return ;
}
func4是没有返回值,调用的时候需要给1个int类型的数
2)函数的调用:
在某个函数中调用函数, 调用的时候需要注意函数的格式(返回值、参数)
func1( ‘a’ ) ; 如果在调用的时候觉得不需要使用函数的返回值, 可以不处理
i = func2( a , b ); 把a和b变量的值传递给函数,函数的返回值赋值给 i
int ret = func3( ); 函数不需要形参,直接使用函数的返回值
func4 ( 10 ); 直接给函数传递一个常量值10
练习: 定义一个函数, 可以返回3个参数中的最大值
编程验证效果
有返回值, 有3个参数
max_func.c:15:8: warning: implicit declaration of function ‘max_func’ [-Wimplicit-function-declaration]
1: 因为函数没有事先声明
2: 定义和调用的函数名或者参数的个数不一致
3)函数的声明:
因为编译器是从上往下进行编译的, 当编译到某个没有实现定义的函数时候会给一个警告, 需要在.c文件的开头增加函数的声明
int max_func(int a, int b , int c); 声明和定义差不多,但是后面跟的是分号
也可以忽略参数名,只保留参数的类型
int max_func(int , int , int );
4)字符串函数的使用
字符串相关的函数声明基本都放在#include <string.h>, 定义都在系统库文件中
函数是由“巨人”写好的~
这类函数不需要关心里面的实现, 但是得根据它的描述充分理解它的功能,并且调用
#include <string.h>
size_t strlen(const char *s);
给一个字符串名,返回数组的有效字符数, 遇到’\0’就停止
int strcmp(const char *s1, const char *s2);
比较两个字符串,返回值为0表示字符串完全相同
int strncmp(const char *s1, const char *s2, size_t n);
比较两个字符串的指定长度,
返回值为0表示字符串指定长度完全相同
strcat
strtok
strstr
作业:
1: 自己写一个函数, 对应的功能和strlen()函数一致
返回值是长整型
参考char_array2.c