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、扩展:五:函数 function1)函数的定义:函数的作用域 函数的返回值 函数名( 形参类别及形参名列表 ){ 具体的功能实现}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变量的值传递给函数,函数的返回值赋值给 iint 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表示字符串指定长度完全相同strcatstrtokstrstr作业:1: 自己写一个函数, 对应的功能和strlen()函数一致 返回值是长整型参考char_array2.c