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类型