从零开始学习嵌入式复习C,从C的数组开始 | 青训营笔记

89 阅读3分钟

从零开始学嵌入式 Day1,数组

引言

由于最近真的很想碰一下嵌入式,很久没有碰C了,跟着课程走了一下基础,就从数组开始,更细致的学习了一下C的东西,感觉确实跟之前粗浅认识的C有所不同,就浅浅记一下笔记。

一、数组

终端编译使用

gcc main.c -o -app

gcc编译、-app编译成app格式

数组特点

(1)内存连续

(2)类型相同

定义方式

存储类型 数据类型 数组名[元素个数];

存储类型

auto(自动,可以不写)、static(静态)

Static

修饰局部变量

可以延长局部变量的生命周期。

int main(){
  for(i<5){
    if(i<3){
      int num = 5;
      num++;
    }
    printf("%d",num);
    printf("***************************");
  }
}

当不加入static时,num会每次重新赋值,所以每次打印的值为6

当加入static时

static int num = 5;

此时转变为静态变量,在程序区域内会一直维持之前的num值而不被赋值,所以会6、7、8逐渐打印下来。

修饰全局变量和函数

表示隐藏,只能在本文件内使用,不能被外部调用。

当有main.c与func.c时,在main内想要调用func的一个变量,可以利用extern,

int 

测试题

输入Username与password,登陆页面:

1.首先要获得字符串,要新建一个UserName与PassWord数组

#define SIZE 20 //定义宏,方便操作
char UserName[SIZE] = {'\0'};//'\0'是初始化必要的操作
char PassWord[SIZE] = {'\0'};

tip:需要理解三种0:0;'0';'\0':0 为 0 ;'0'为字符0,值为48;'\0'值为0

2.扫描输入,打印输出

(1)scanf输入值的问题,输入存放地址问题:

首先理解代码:

int a;//初始定义
scanf("%d",&a); //需要加入,因为是需要改变的
printf("a = %d\n",a) //不需要加取地址符

scanf与printf基本上可以分为一类

32位系统内,8个16进制字符表示地址

数组名即可代表地址,所以scanf在把东西传入数组的时候,直接输入数组名就行了

scanf("%s",UserName);  //或者利用gets(UserName);
printf("%s\n",PassWord);  //或者利用puts(PassWord);

但是gets会被明令禁止:因为gets没有脑子,一定会把输入读满

但是还有个fgets,输入man fgets查询,fgets会比较的聪明

man fgets;

fgets永远会少读一个,留一个位置留给\0,剩余补0为了防止溢出

从man中可以查询到,gets的参数很少,fgets参数比它多的多

char *gets(char *s);
char *fgets(char *s, int size, FILE *stream)

聪明在size,可以限制大小,同时fgets可以读取文件

(2)对等判断:

判断有很多选择:strcmp,strncmp都是比较两个字符串

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);

int是因为比较时,如果不同,会利用ascii码进行相减,会给出一个差值

if(strcmp(UserName,"hqyj") == 0);  //公司内需要避免逻辑错误,所以双等于很有可能出现问题,所以在判断时最好将常量写在左边

所以正确的写法为:

if(0 == strcmp(UserName,"hqyj"));  
{
  printf("OK\n");
}else{printf("error!\n");}