C语言函数

11 函数

11.3 主函数

主函数返回0表示运行成功,如果返回非0整数,就表示运行失败。

主函数的参数:

主函数的声明可以带两个参数:

int main(int argc,char *argv[]){
    //函数体
}

argc至少是1个,argv是一个指针数组,数组的每个元素都是字符串

#include <stdio.h>
int main(int argc,char * argv[]){
    //主函数的参数
    printf("%d\n",argc);  //1

    for (int i = 0; i < argc; i++)
    {
        printf("%s\n",argv[i]);  //F:\workpace\chapter11\ex1.exe
    }

}

11.5 作用域

分为全局作用域或局部作用域

局部作用域存放在栈中,全局作用域存放在全局静态区,包括静态变量,静态函数也存放在全局静态区。

不建议使用全部变量

全部变量对于整个工程都可见,其他文件中,使用extern外部声明后,就可以直接使用。

11.6 static关键字

静态全局变量仅对当前文件可见。

静态局部变量也是在作用域范围内有用,但是使用了static之后他的寿命延长,每次调用完之后这个局部变量是不会立刻就会销毁的,仍然存在,直到程序运行结束,变量才会销毁。

#include<stdio.h>

void fun(int i){
    static int value = 1;
    value ++;
    i++;
    printf("value = %d\t",value);
    printf("i = %d\n",i);
}

int main(){
    fun(0); 
    fun(0);
    fun(0);
    return 0;
}

// value = 2       i = 1
// value = 3       i = 1
// value = 4       i = 1

value是静态变量,只会定义一次,也就是说不管fun这个函数执行多少次

 static int value = 1;

这个定义语句只会在第一次调用fun的时候执行,以后都不会再执行这条语句。静态变量是通过静态变量后面的一个32位内存来做记录,以标识这个静态变量是否已经初始化了。

11.7 递归函数

在嵌入式开发中使用的比较少,但是面试的时候可能会出关于递归函数的代码。

11.8 常用的系统函数

11.8.1 字符串相关

头文件:

<string.h>
函数名描述
strlen(str)返回str的长度,类型是size_t
strcpy(str1,str2)将str2中的字符串复制到str1中
strcat(str1,str2)将str2中的字符串追加到str1后面
11.8.2 头文件中的函数

sprintf(),用于将格式化数据写入字符串。相比于 printf(),多了一个参数,第一个参数是要写入的字符串,后面参数与 printf() 一致。简单地讲,sprintf() 是将内容写入字符串而不是输出。

sscanf(),用于从一个字符串中按照指定的格式提取数据。相比于 scanf(),多了一个参数,第一个参数是要提取数据的字符串,后面参数与 scanf() 一致。简单地讲,sscanf() 是从字符串中提取数据而不是从用户输入提取数据。

不建议用。

#include <stdio.h>
#include <string.h>

int main()
{

    // 字符串输入输出
    // 输出到字符串sprintf
    char output[100];
    char name[] = "小白";
    int age = 19;
    double score = 69.5;

    sprintf(output, "我叫%s,我今年%d岁,我的成绩为:%.2f\n", name, age, score);
    printf("%s\n", output);
    
    // 从字符串提取数据sscanf
    char inputString[] = "我叫张飞,我今年18岁,我的成绩为:98.50";
    char name2[20];
    int age2;
    double score2;

    // 使用 sscanf 从字符串中提取数据
    sscanf(inputString, "我叫%6s,我今年%d岁,我的成绩为:%lf", name2, &age2, &score2);

    // 输出提取的数据
    printf("score1=%s, score2=%d, score3=%.2f", name2, age2, score2);

    return 0;
}

%6s:是截取六个字符的数据,一个汉字是三个字符,有的地方是四个字符,如果在sscanf中不截取数据,“我叫”之后所有的数据都会被存入数组中,就无法正确的使用。

11.8.3 日期时间相关的函数

头文件

<time.h>
函数名描述
time(&变量)获取当前日期赋值到变量中,time_t类型变量,返回的是以1970年1月1日开始的时间戳,秒为单位
ctime(&时间值)将时间值转为字符串并返回,时间值是需要time_t类型
difftime(时间值1,时间值2)返回两个时间值的差,返回值是double类型,时间值需是time_t类型
11.8.4 数学相关的函数

头文件

<math.h>
函数名描述
sqrt(x)计算平方根
cbrt(x)计算立方根
pow(x,y)计算x的y次方
fabs(x)计算x的绝对值
ceil(x)向上取整
floor(x)向下取整
round(x)四舍五入取整
trunc©截断小数部分

返回值都是double类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值