练习: 实现mystrcmp函数的功能
#include <stdio.h> int Mystrcmp(const char *p,const char *q) { while(*p != '\0' && *q != '\0') { if(*p > *q) { return 1; } else if(*p < *q) { return -1; } p++; q++; } if(*p == '\0' && *q != '\0') { return -1; } else if(*p != '\0' && *q == '\0') { return 1; } else if(*p == '\0' && *q == '\0') { return 0; } } int main(int argc, const char *argv[]) { char s1[] = "hellworld"; char s2[] = "hello z"; int ret = Mystrcmp(s1,s2); if(ret == 0) { printf("s1 = s2\n"); } else if(ret > 0) { printf("s1 > s2\n"); } else { printf("s1 < s2\n"); } return 0; }
8.3 函数的参数
#include <stdio.h> int i = 100; int j = 200; void myadd1(); void myadd2(); void myadd3(int a,int b); int main(int argc, const char *argv[]) { myadd1(); myadd2(); myadd3(1,2); return 0; } void myadd1() { int sum = i+j; printf("sum = %d\n",sum); return; //return 1; } void myadd2() { i = 300; j = 400; return; } void myadd3(int a,int b) //形参,参数之间用逗号隔开 { int sum = a + b; printf("sum = %d\n",a+b); }
8.4 函数的返回值
#include <stdio.h> int add(int a,int b); int main(int argc, const char *argv[]) { int a = 1,b = 2; //实参 int ret = add(a,b); return 0; } //函数名左边的是返回值类型,要与返回值的类型一致 int add(int a,int b) { int sum = a+b; //函数的返回值:含税执行结束的时候,如果需要将有些值返回 //给其他函数,那么就需要有返回值,反之不需要返回值 return sum; //将结果返回 }
练习:
编写一个函数,返回a的n次幂
#include <stdio.h> int myPow(int a,int n); int main(int argc, const char *argv[]) { printf("%d\n",myPow(3,5)); return 0; } int myPow(int a,int n) { if(a == 0) { return 0; } int num = 1; while(n != 0) { num = num *a; n--; } return num; }
8.5 函数的传参方式
8.5.1 传参方式
一般分为三种:
全局变量传参:
一般不用,因为全局变量本身就可以在函数内部直接使用,不需要专门传参
值传参:将实参的值传递给形参
地址传参:将实参的地址传给形参
#include <stdio.h> void Swap(int *a,int *b); int main(int argc, const char *argv[]) { int a = 100,b = 200; printf("a = %d,b = %d\n",a,b); Swap(&a,&b); printf("a = %d,b = %d\n",a,b); return 0; } void Swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b = temp; }
8.5.2 一维数组传参
#include <stdio.h> //一维数组作为参数传给函数,有两种方法 //第一种:传int a[] //第二种:传 int *a //常用 //第三种:传 int a[100] //void myOrder(int *arr,int n) //void myOrder(int arr[],int n) void myOrder(int arr[1000],int n) { int i; printf("sizeof(arr) = %ld\n",sizeof(arr));//arr只是一个指针变量,不是数组名,所以无法通过这个指针变量获取数组所占空间大小 for(i = 0 ; i < n;i++) { printf("%d ",arr[i]); } putchar(10); } int main(int argc, const char *argv[]) { int a[] = {1,2,3,4,5,6,7,8,9,10}; myOrder(a,sizeof(a)/sizeof(a[0])); return 0; }
练习:编写函数,实现冒泡排序
#include <stdio.h> void Sort(int a[],int length) { int i,j; for(i = 0 ; i < length - 1;i++) { for(j = 0 ; j < length - 1 - i;j++) { if(a[j] < a[j+1]) { #if 0 int t = a[j]; a[j] = a[j+1]; a[j+1] = t; #endif a[j] = a[j] + a[j + 1]; a[j + 1] = a[j] - a[j + 1]; a[j] = a[j] - a[j + 1]; } } } } void Print(int a[],int length) { int i; for(i = 0 ; i < length;i++) { printf("%d ",a[i]); } putchar(10); } int main(int argc, const char *argv[]) { int a[10] = {0}; printf("请输入10个数字:\n"); int i; int length = sizeof(a)/sizeof(a[0]); for(i = 0 ; i < length;i++) { scanf("%d",&a[i]); } Sort(a,length); Print(a,length); return 0; }
8.5.3 二维数组的传参
#include <stdio.h> //二维数组传参 //方法1:直接传int a[3][4] //方法2:传数组指针 void ArrayOrder(int a[3][4]) { int i,j; for(i = 0 ; i < 3;i++) { for(j = 0 ; j < 4;j++) { printf("%-5d",a[i][j]); } putchar(10); } } int main(int argc, const char *argv[]) { int a[3][4] = {1,2,3,4,5,6,7,8,9,10,12,11}; ArrayOrder(a); return 0; }
8.5.4 指针数组传参
#include <stdio.h> //指针数组传递: //方式1:直接传指针数组 //方式2: 传二级指针 void PointArrayOrder(char *s[],int n) { int i; for(i = 0 ; i < n;i++) { printf("s[%d] = %s\n",i,s[i]); } } int main(int argc, const char *argv[]) { char *s[4]; char s1[] = "hello world"; char s2[] = "hello nanjing"; char s3[] = "hello beijing"; char s4[] = "hello shanghai"; s[0] = s1; s[1] = s2; s[2] = s3; s[3] = s4; PointArrayOrder(s,4); return 0; }
8.6 main的参数
#include <stdio.h> //main的参数可以不谢,也可以只有一个argc,也可以有两个argc和argv, //argc:int类型变量,用于保存命令行参数的个数 //argv:是一个指针数组,用来保存多个字符串,用来保存命令行传入的每一个字符串 int main(int argc, const char *argv[]) { printf("argc = %d\n",argc); int i; for(i = 0; i < argc;i++) { printf("argv[i] = %s\n",argv[i]); } return 0; }
8.7 指针函数
指针函数:本质是一个函数,函数的返回值是一个地址
#include <stdio.h> #include <string.h> //返回值是指针的函数,叫指针函数 char *find_sub(char *str,const char *sub) { int str_len = strlen(str); int sub_len = strlen(sub); int i; for(i = 0 ; i < str_len - sub_len + 1 ;i++) { if(strncmp(str + i,sub,sub_len) == 0) { return str + i; } } return NULL; } int main(int argc, const char *argv[]) { char str[] = "helloworld"; char sub[] = "worl"; char *s = find_sub(str,sub); if(NULL == s) { printf("不存在!\n"); return -1; } printf("s = %s\n",s); return 0; }
8.7.1 malloc/free
头文件:#include 原型:void *malloc(size_t size); void free(void *ptr); 功能:malloc用于在堆上手动申请size个字节大小的空间 free用于手动释放malloc申请的空间 参数:(malloc):size表示申请size个字节 (free):ptr:表示申请空间的首地址 返回值:(malloc): 成功:返回申请空间的首地址,类型为void*(万能指针) 失败:返回NULL (free):无返回值
#include <stdio.h> #include <string.h> #include <stdlib.h> //返回值是指针的函数,叫指针函数 char *find_sub(char *str,const char *sub) { int str_len = strlen(str); int sub_len = strlen(sub); int i; for(i = 0 ; i < str_len - sub_len + 1 ;i++) { if(strncmp(str + i,sub,sub_len) == 0) { return str + i; } } return NULL; } void InitMemory(char **str,char **sub) { *str = (char *)malloc(sizeof(char)*128); *sub = (char *)malloc(sizeof(char)*32); } int main(int argc, const char *argv[]) { //char str[] = "helloworld"; //char sub[] = "worl"; char *str = NULL,*sub = NULL; InitMemory(&str,&sub); scanf("%s%s",str,sub); char *s = find_sub(str,sub); if(NULL == s) { printf("不存在!\n"); return -1; } printf("s = %s\n",s); free(str); free(sub); str = NULL; sub = NULL; return 0; }