对于一个C程序而言,它所有的命令都包含在函数内。每个函数都会执行特定的任务。有一个特别的函数,名称为main()——该函数是程序启动后,第一个执行的函数。其他所有函数都是main()函数的子函数(或者与之相关联的过程,例如回调函数),并且它们的函数名称可以自己设定。每个函数都只能被定义一次。但一个函数可以根据需要被多次的声明和调用。
C 语言中的函数定义的一般形式如下:
return_type function_name( parameter list )
{
body of the function
}
函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
下来看个示例:
int add(int a, int b){
int result;
rusult = a + b;
return result;
}
{}之间的内容则为函数体。
在使用函数之前应该先声明,事先通知编译器该函数的类型:换句话说,一个声明即是描述一个函数的接口。声明至少应指明函数返回值的类型,如下例所示:
int add(int a, int b);
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
int max(int, int);
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
接下来我们再看一个示例:
#include <stdio.h>
/* 函数声明 */
int max(int num1, int num2);
int main()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;
/* 调用函数来获取最大值 */
ret = max(a, b);
printf("Max value is : %d\n", ret);
return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
运行结果如下:
函数调用这一块我想着重说下「递归调用」
所谓递归,就是自己调用自己。C语言中函数可以直接或间接的调用自己,所谓的间接调用,是指在递归函数调用的下层函数中再调用自己,递归关系如下图:
语法格式如下:
void recursion()
{
statements;
... ... ...
recursion(); /* 函数调用自身 */
... ... ...
}
int main()
{
recursion();
}
流程图:
下来我们一起看一个关于函数递归调用的示例
//下面的实例使用递归函数生成一个给定的数的斐波那契数列:
#include <stdio.h>
int fibonaci(int i)
{
if(i == 0)
{
return 0;
}
if(i == 1)
{
return 1;
}
return fibonaci(i-1) + fibonaci(i-2);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("%d\t\n", fibonaci(i));
}
return 0;
}
函数运行结果:
C语言中字符数据输出使用的是putchar()函数,它的作用就是向终端输出一个字符。
函数格式如下int putchar(int ch);
如果要向终端输出一个字符'A',我们可以使用putchar('A');
接下来我们来看一个例子
通过多次调用putchar函数,我们在终端打印出Hello.
与上面介绍的putchar对应的就是getchar函数,getchar的作用就是从终端获取输入一个字符。函数格式如下int getchar();
我们再来看一个例子
下来我们来看字符串输入输出函数,顾名思义字符串就是一串字符(多个字符)这里先不做详细的说明,主要通过两个示例来看下puts()和gets()函数
从结果可以看出
函数语法:strcpy(目的字符串数组名, 源字符串数组名)
功能:把源字符串数组中的字符串复制到目的字符串数组中,字符串结束标志"\0"也一同复制 下面通过实例来了解一下strcpy函数的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char str1[30], str2[30];
printf("请输入目的字符串:\n");
gets_s(str1, 30);
printf("请输入源字符串:\n");
gets_s(str2, 30);
printf("输出目的字符串:\n");
puts(str1);
printf("输出源字符串:\n");
puts(str2);
strcpy(str1, str2);
printf("调用strcpy函数后目的字符串:\n");
puts(str1);
return 0;
}
运行结果:
函数语法:strcat(目的字符串数组名, 源字符串数组名)
功能:把源字符串数组中的字符串连接到目的字符串数组的字符串的后面,并删去目的字符串中原有的结束标志"\0" 下面通过实例来了解一下strcat函数的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char str1[30], str2[30];
printf("请输入目的字符串:\n");
gets_s(str1, 30);
printf("请输入源字符串:\n");
gets_s(str2, 30);
printf("输出目的字符串:\n");
puts(str1);
printf("输出源字符串:\n");
puts(str2);
strcat(str1, str2);
printf("调用strcat函数后目的字符串:\n");
puts(str1);
return 0;
}
运行结果:
函数语法:strcmp(字符串数组名1, 字符串数组名2)
功能:按照ASCII码顺序比较两个字符数组中的字符串,并由函数返回值返回比较结果 返回值如下:• 串1=串2,返回0 • 串1>串2,返回正数 • 串1<串2,返回负数 注意:当两个字符串进行比较时,若出现不同字符,则以第一个不同的字符的比较结果作为整个比较结果。下面通过实例来了解一下strcmp函数的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char user[18] = {"zhangsan"};
char pwd[8] = {"123456"};
char userStr[18], pwdStr[8];
printf("请输入用户名:\n");
gets_s(userStr, 18);
if (strcmp(user, userStr))
{
printf("您输入的用户名有误!\n");
return -1;
}
else
{
printf("请输入密码:\n");
gets_s(pwdStr, 8);
if (strcmp(pwd, pwdStr))
{
printf("您输入的密码有误!\n");
return -1;
}
else
{
printf("欢迎进入!\n");
return 0;
}
}
}
运行结果:
函数语法:strlen(字符串数组名)
功能:计算字符串的实际长度(不含字符串结束标志“\0”),函数返回值为字符串的实际长度 下面通过实例来了解一下strlen函数的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
int len = 0;
char user[18] = {"zhangsan"};
char pwd[8] = {"123456"};
len = strlen(user);
printf("用户名的实际长度为:%d\n", len);
len = strlen(pwd);
printf("密码的实际长度为:%d\n", len);
strcat(user, pwd);
len = strlen(user);
printf("用户名和密码的实际长度为:%d\n", len);
return 0;
}
运行结果:
函数语法:strupr(字符串数组名)
功能:将字符串中的小写字母转换成大写字母 函数语法:strlwr(字符串数组名)
功能:将字符串中的大写字母转换成小写字母 下面通过实例来了解一下strupr,strlwr函数的使用
#include<stdio.h>
#include<string.h>
int main() {
char str[18] = {"Hello World!"};
printf("原字符串为:%s\n", str);
strupr(str);
printf("原字符串转换成大写:%s\n", str);
strlwr(str);
printf("原字符串转换成小写:%s\n", str);
return 0;
}
运行结果:
在项目开发中,为了防止一些敏感信息的泄露,通常我们会对这些信息进行加密,比如用户的登录密码,如果不加密直接进行明文存储的话,就很容易被人看到,但密码对用户来说是保密的,因此我们需要对数据进行加密后再存储,这样一来,即使被看到也是我们加密后的数据,从而大大提高了安全性。我们就来写一个小小的例子来模仿一下字符串加密和解密的过程。
「源代码」
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
int result = 1;
int i;
int count = 0;
char text[128] = {'\0'};//存放明文字符串
char cryptograph[128] = {'\0'};//存放密文字符串
while (1)
{
if (result==1)
{
printf("请输出要加密的明文:\n");
scanf("%s", &text);
count = strlen(text);
for (i = 0; i < count; i++)
{
cryptograph[i] = text[i] + i + 5;//加密
}
cryptograph[i] = '\0';
printf("加密后的密文是:%s\n", cryptograph);
}
else if (result==2)
{
count = strlen(text);
for (i = 0; i < count; i++)
{
text[i] = cryptograph[i] - i - 5;//解密
}
text[i] = '\0';
printf("解密后的明文是:%s\n",text);
}
else if (result==3)
{
break;
}
else
{
printf("请按提示输入:\n");
}
printf("输入1加密明文,输入2对刚加密的明文进行解密,输入3退出程序:\n");
printf("请按提示输入:\n");
scanf("%d",&result);
}
return 0;
}
「运行结果:」
「程序分析:」
这里采用的加密算法十分简单,就是将字符串中的每个字符加上它在字符串中的位置和一个偏移值5,cryptograph[i] = text[i] + i + 5;//加密
我们输入的字符串是helloworld
,第一个字符'h'在字符串中的位置是0,那么它对应的密文字符是'h'+0+5
,即'm'。