前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言从青铜到王者——函数详解【多个实例】

C语言从青铜到王者——函数详解【多个实例】

作者头像
C语言中文社区
发布2022-05-31 09:10:06
5840
发布2022-05-31 09:10:06
举报
文章被收录于专栏:C语言中文社区

对于一个C程序而言,它所有的命令都包含在函数内。每个函数都会执行特定的任务。有一个特别的函数,名称为main()——该函数是程序启动后,第一个执行的函数。其他所有函数都是main()函数的子函数(或者与之相关联的过程,例如回调函数),并且它们的函数名称可以自己设定。每个函数都只能被定义一次。但一个函数可以根据需要被多次的声明和调用。

函数的定义

C 语言中的函数定义的一般形式如下:

代码语言:javascript
复制
return_type function_name( parameter list )
{
   body of the function
}

函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

  • 「返回类型:」 一个函数可以返回一个值。「return_type」 是函数返回的值的数据类型。有些函数执行所需的操作而不要返回值,在这种情况下,return_type 是关键字 「void」
  • 「函数名称:」 这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 「参数:」 参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 「函数主体:」 函数主体包含一组定义函数执行任务的语句。

下来看个示例:

代码语言:javascript
复制
int add(int a, int b){
    int result;
    rusult = a + b;
    return result;
}

{}之间的内容则为函数体。

函数的声明和调用

在使用函数之前应该先声明,事先通知编译器该函数的类型:换句话说,一个声明即是描述一个函数的接口。声明至少应指明函数返回值的类型,如下例所示:

int add(int a, int b);

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

int max(int, int);

创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。

当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。

接下来我们再看一个示例:

代码语言:javascript
复制
#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语言中函数可以直接或间接的调用自己,所谓的间接调用,是指在递归函数调用的下层函数中再调用自己,递归关系如下图:

  • 直接调用
  • 间接调用

语法格式如下:

代码语言:javascript
复制
void recursion()
{
   statements;
   ... ... ...
   recursion(); /* 函数调用自身 */
   ... ... ...
}
 
int main()
{
   recursion();
}

流程图:

下来我们一起看一个关于函数递归调用的示例

代码语言:javascript
复制
//下面的实例使用递归函数生成一个给定的数的斐波那契数列:
#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;
}

函数运行结果:

字符数据输入输出函数

字符数据输出函数putchar()

C语言中字符数据输出使用的是putchar()函数,它的作用就是向终端输出一个字符。

函数格式如下int putchar(int ch);如果要向终端输出一个字符'A',我们可以使用putchar('A');接下来我们来看一个例子

通过多次调用putchar函数,我们在终端打印出Hello.

字符数据输入函数getchar()

与上面介绍的putchar对应的就是getchar函数,getchar的作用就是从终端获取输入一个字符。函数格式如下int getchar();我们再来看一个例子

字符串输入输出函数

下来我们来看字符串输入输出函数,顾名思义字符串就是一串字符(多个字符)这里先不做详细的说明,主要通过两个示例来看下puts()和gets()函数

从结果可以看出

  • puts输出字符串后自动换行
  • puts输出字符串时遇到'\0'停止输出

常用的6个字符串处理函数

字符串复制

函数语法:strcpy(目的字符串数组名, 源字符串数组名)功能:把源字符串数组中的字符串复制到目的字符串数组中,字符串结束标志"\0"也一同复制 下面通过实例来了解一下strcpy函数的使用

代码语言:javascript
复制
#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函数的使用

代码语言:javascript
复制
#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函数的使用

代码语言:javascript
复制
#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函数的使用

代码语言:javascript
复制
#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函数的使用

代码语言:javascript
复制
#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;
}

运行结果:

实例练习

在项目开发中,为了防止一些敏感信息的泄露,通常我们会对这些信息进行加密,比如用户的登录密码,如果不加密直接进行明文存储的话,就很容易被人看到,但密码对用户来说是保密的,因此我们需要对数据进行加密后再存储,这样一来,即使被看到也是我们加密后的数据,从而大大提高了安全性。我们就来写一个小小的例子来模仿一下字符串加密和解密的过程。

「源代码」

代码语言:javascript
复制
#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'。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数的定义
  • 函数的声明和调用
  • 字符数据输入输出函数
    • 字符数据输出函数putchar()
      • 字符数据输入函数getchar()
      • 字符串输入输出函数
      • 常用的6个字符串处理函数
        • 字符串复制
          • 字符串连接
            • 字符串比较
              • 获取字符串长度
                • 字符串大小写转换
                • 实例练习
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档