当前位置:   article > 正文

从零开始的嵌入式系统开发学习Day3(linux C)_gets(buf)

gets(buf)

目录

一、输入输出函数

1.1 getchar()/putchar()

1.1.1 getchar()

1.1.2 putchar()

1.2 get()/puts()

1.2.1 gets()

1.2.2 puts()

1.3 printf()/scanf()

1.3.1 printf()

1.3.2 scanf()

1.3.3 scanf附加字符

1.3.4 scanf输入多个内容以及垃圾字符的处理

二、控制语句

2.1 概念

2.2 if……else语句

2.2.1 if语句的形式

2.2.2 练习:大小写转换

2.3 switch……case语句

2.3.1 格式

2.3.2 注意事项

三、循环语句

3.1 while循环

3.1.1 格式

3.1.2 循环的简单使用

3.1.3 do..while..使用

3.2 for 循环

3.2.2 for循环的注意事项

3.2.3 for循环的使用

3.2.4 打印100-1000以内的所有的水仙花数

四 辅助控制关键词

4.1 goto

4.2 break

4.3 continue

4.4 return

五 数组

5.1 数组的概念

5.2 一维数组

5.2.1 一维数组的定义

5.2.2 一维数组的性质


一、输入输出函数

1.1 getchar()/putchar()

1.1.1 getchar()

        头文件:#include <stdio.h>
        原型:int getchar(void);
        功能:从终端读取一个字符
        参数:无
        返回值:从终端读取到的字符

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. /*int ch;
  5. ch = getchar();
  6. printf("ch = %c %d\n",ch,ch);
  7. */
  8. int a,b,c;
  9. a = getchar();
  10. b = getchar();
  11. c = getchar();
  12. printf("a = %c %d\n",a,a);
  13. printf("b = %c %d\n",b,b);
  14. printf("c = %c %d\n",c,c);
  15. return 0;
  16. }

1.1.2 putchar()

        头文件:#include <stdio.h>
        原型:int putchar(int c);
        功能:向终端输出一个字符
        参数:c:要输出的字符
        返回值:输出的字符

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //参数为一个字符
  5. putchar('w');
  6. putchar('\n');
  7. //参数为一个ascii
  8. putchar(97);
  9. putchar(10);
  10. int a = 'h';
  11. int b = 10;
  12. putchar(a);
  13. putchar(b);
  14. return 0;
  15. }

1.2 get()/puts()

1.2.1 gets()

        头文件:#include <stdio.h>
        原型:char *gets(char *s);
        功能:从终端读取一个字符串
        参数:s:保存读取的数据的内容:一般是一个数组,char buf[32]
        返回值:保存的字符串

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. char str[32] = {0};
  5. gets(str);
  6. printf("str = %s\n",str);
  7. return 0;
  8. }

1.2.2 puts()

        头文件:#include <stdio.h>
        原型:char *puts(const char *s);
        功能:向终端输出一个字符串
        参数:s:要输出的内容 
        返回值:输出的字符串的字节数

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. //puts函数自带换行功能
  5. puts("hellworld");
  6. char s[32] = "helloworld";
  7. puts(s);
  8. char buf[32] = {0};
  9. gets(buf);
  10. puts(buf);
  11. return 0;
  12. }

1.3 printf()/scanf()

1.3.1 printf()

        printf函数是一个二行缓冲函数(1024k),先将内容写到缓存区,满足一定条件后,才会将内容写入对应的文件或者流中
        1.缓冲区满
        2.雪茹的字符中有'\n','\r'
        3.调用fflush或者stdout手动刷新缓冲区
        4.调用scanf等要从缓冲区读取数据时,也会将缓冲区内的数据刷新
        5.程序结束时也会刷新缓冲区

        头文件:#include <stdio.h>
        原型:int printf(const char *format,……)
        功能:向终端按照格式输出字符串
        参数:format:带格式要输出的内容
        普通字符:原样输出
                例如:printf("hello world!\n");
         格式说明:%[修饰符]格式字符,用于指定格式输出
         例如:printf("a = %d\n",a);
           %d:32位有符号十进制数
           %u:32位无符号十进制数
           %o:输出八进制数
           %x:输出十六进制数
           %e:输出指数形式数
           %c:输出字符
           %s:输出字符串
           %%:输出%
           %p:输出地址
    附加格式字符:
           #:用于输出八进制或者十六进制的前导符
            l:用于输出long类型或者double类型的数据
          m:设置输出内容的宽度
                 如果数据的宽度大于等于m,则没有影响,
                 如果数据的宽度小于m,则默认右对齐,左缺的位置补空格
            0:当设置宽度后,默认右对齐,左边空格的位置补0
             -:将右对齐改成左对齐
           .n:保留小数点n位
        返回值:输出的字节个数

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. int num = 256;
  5. printf("%d%d%d\n",num,num,num);
  6. //5:将输出的宽度设置为5
  7. printf("%5d%5d%5d\n",num,num,num);
  8. //0:右对齐左边补0
  9. printf("%05d%05d%05d\n",num,num,num);
  10. //-:右对齐改成左对齐
  11. printf("%-5d%-5d%-5d\n",num,num,num);
  12. //:0不能用于左对齐
  13. printf("%-05d%-05d%-05d\n",num,num,num);
  14. float f = 45.45678912345;
  15. printf("f = %f\n",f);
  16. //.2:保留小数点后2位,并且会四舍五入
  17. printf("f = %6.3f\n",f);
  18. printf("f = %p\n",&f);
  19. return 0;
  20. }

1.3.2 scanf()

        头文件:#include <stdio.h>
        原型:int scanf(const char *format,……);
        功能:按照格式向终端输入指定的内容
        参数:format:要输入的内容 
        格式字符:
          %d:整形数据
           %f:浮点型数据
          %c:字符数据
          %s:字符串数据
            。。。
        返回值:成功保存的内容的个数

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. /*
  5. int num;
  6. int ret = scanf("%d",&num);
  7. printf("ret = %d,num = %d\n",ret,num);
  8. */
  9. /*
  10. char ch;
  11. scanf("%c",&ch);
  12. printf("ch = %c %d\n",ch,ch);
  13. */
  14. /*
  15. char buf[32] = {0};
  16. //scanf默认只能保存一个不带空格的字符串
  17. scanf("%s",buf);
  18. //找到换行符才结束输入
  19. scanf("%[^\n]",buf);
  20. printf("buf = %s\n",buf);
  21. */
  22. /*int num;
  23. scanf("[%d]",&num);
  24. printf("num = %d\n",num);
  25. */
  26. int a,b,c;
  27. scanf("%d,%d,%d",&a,&b,&c);
  28. printf("a = %d,b = %d,c = %d\n",a,b,c);
  29. return 0;
  30. }

1.3.3 scanf附加字符

        m:设置输入的宽度,如果输入的内容超过设置的宽度,只会保存设置宽度的内容

        *:抑制符,当带有*的格式的字符输入的内容不会保存到与之对应的变量中,而是将下一个不带*的格式的字符的内容保存在之前的变量中

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. /*
  5. int year,month,day;
  6. scanf("%2d%2d%2d",&year,&month,&day);
  7. printf("%d/%d/%d\n",year,month,day);
  8. char buf[32] = {0};
  9. scanf("%5s",buf);
  10. printf("buf = %s\n",buf);
  11. */
  12. int a,b,c;
  13. scanf("%d %*d %d %*d %d",&a,&b,&c);
  14. printf("a = %d,b = %d,c = %d\n",a,b,c);
  15. return 0;
  16. }

1.3.4 scanf输入多个内容以及垃圾字符的处理

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. #if 0
  5. int a,b,c;
  6. scanf("%d %d %d",&a,&b,&c);
  7. printf("a = %d,b = %d,c = %d\n",a,b,c);
  8. #endif
  9. #if 0
  10. char a,b,c;
  11. scanf("%c%c%c",&a,&b,&c);
  12. printf("a = %c,b = %c,c = %c\n",a,b,c);
  13. #endif
  14. /* 一个scanf处理垃圾字符 */
  15. //方法1:使用抑制符
  16. /* char a,b,c;
  17. scanf("%c%*c%c%*c%c",&a,&b,&c);
  18. printf("a = %c,b = %c,c = %c\n",a,b,c);*/
  19. //方法2:使用空格隔开
  20. /*char a,b,c;
  21. scanf("%c %c %c",&a,&b,&c);
  22. printf("a = %c,b = %c,c = %c\n",a,b,c);*/
  23. /*多个scanf处理垃圾字符*/
  24. int id;
  25. char name[32];
  26. char sex;
  27. int score;
  28. char bg;
  29. /*
  30. printf("请输入学号:");
  31. scanf("%d",&id);
  32. printf("请输入姓名:");
  33. scanf("%s",name);
  34. printf("请输入性别:");
  35. scanf("%c",&sex);
  36. printf("请输入分数:");
  37. scanf("%d",&score);
  38. printf("请输入年龄:");
  39. scanf("%d",&age);
  40. */
  41. #if 0 //使用抑制符
  42. printf("请输入学号:");
  43. scanf("%d",&id);
  44. printf("请输入姓名:");
  45. scanf("%s",name);
  46. printf("请输入性别:");
  47. scanf("%*c%c",&sex);
  48. printf("请输入分数:");
  49. scanf("%d",&score);
  50. printf("请输入是否有女朋友:");
  51. scanf("%*c%c",&bg);
  52. #endif
  53. #if 0 //使用getchar
  54. printf("请输入学号:");
  55. scanf("%d",&id);
  56. printf("请输入姓名:");
  57. scanf("%s",name);
  58. getchar();
  59. printf("请输入性别:");
  60. scanf("%c",&sex);
  61. printf("请输入分数:");
  62. scanf("%d",&score);
  63. getchar();
  64. printf("请输入是否有女朋友:");
  65. scanf("%c",&bg);
  66. #endif
  67. // 使用空格
  68. printf("请输入学号:");
  69. scanf("%d",&id);
  70. printf("请输入姓名:");
  71. scanf("%s",name);
  72. printf("请输入性别:");
  73. scanf(" %c",&sex);
  74. printf("请输入分数:");
  75. scanf("%d",&score);
  76. printf("请输入是否有女朋友:");
  77. scanf(" %c",&bg);
  78. return 0;
  79. }

二、控制语句

2.1 概念

        控制语句主要解决一些代码需要执行,一些代码不执行,或者相同的代码要执行很多次。

分类:

        分支语句:

  1. if...esle
  2. switch...case...

        循环语句:

  1. goto
  2. while
  3. do...while...
  4. for

        辅助控制关键字:

  1. goto
  2. break
  3. continue
  4. return

2.2 if……else语句

2.2.1 if语句的形式

  1. if(表达式)
  2. {
  3. 语句块
  4. }
  5. 或:
  6. if(表达式)
  7. {
  8. 语句块1
  9. }
  10. else
  11. {
  12. 语句块2
  13. }
  14. if(表达式1
  15. {语句块1}
  16. else if(表达式2
  17. {语句块2}
  18. else
  19. {语句块3}
  20. 注意事项:
  21. 1.if的表达式非0即为真
  22. if(0) //
  23. if(1) //
  24. if(0.000000001) //
  25. if(a) ---->if(a != 0)
  26. if(!a) ---->if(a == 0)
  27. if(a = 0) //
  28. if(a = 1) //
  29. 2.if或者else语句后面只有一条代码,可以不加{},但是一般为了不产生歧义,最好加上
  30. 3.else后面不能跟表达式
  31. ifelse只能执行一条
  32. else不能单独使用,而且else默认和与之最近的一个if关联。
  33. if(表达式1)
  34. {
  35. if(表达式2)
  36. {
  37. }
  38. }

2.2.2 练习:大小写转换

        在终端输入一个字符,如果是大写字母,将其转换为小写字母,如果是小写字母,将其转化为大写字母;并输出,如果是字符数字,将其转化为数字输出。

        ‘h’---->'H'

        'H'---->'h'

        '6'----->6

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char a;
  5. printf("please input :\n");
  6. scanf("%c",&a);
  7. if(a >= 'A' && a <= 'Z')
  8. {
  9. a = a + 32;
  10. printf("a = %C\n",a);
  11. }
  12. else if(a >= 'a' && a <= 'z')
  13. {
  14. a = a - 32;
  15. printf("a = %c\n",a);
  16. }
  17. else if(a >= '0' && a <= '9')
  18. {
  19. a = a - 48;
  20. printf("a = %d\n",a);
  21. }
  22. else
  23. {
  24. printf("error!\n");
  25. }
  26. return 0;
  27. }

2.3 switch……case语句

        switch语句和if语句一样,也是分支语句,只不过switch语句用于条件过多的情况下使用

2.3.1 格式

  1. switch(变量或者变量表达式)
  2. {
  3. case 常量或者常量表达式1
  4. 语句块1
  5. break
  6. case 常量或者常量表达式2
  7. 语句块2
  8. break
  9. case 常量或者常量表达式3
  10. 语句块3
  11. break
  12. case 常量或者常量表达式4
  13. 语句块4
  14. break
  15. default
  16. 语句块n;
  17. break
  18. }
  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. int num;
  5. printf("***1.注册 2.登录 3.退出***\n");
  6. printf(">>>> ");
  7. scanf("%d",&num);
  8. switch(num)
  9. {
  10. case 1:
  11. printf("正在执行注册操作\n");
  12. break;
  13. case 2:
  14. printf("正在执行登录操作\n");
  15. break;
  16. case 3:
  17. printf("正在退出,请稍等..\n");
  18. break;
  19. default:
  20. printf("您输入有误,请重新输入\n");
  21. break;
  22. }
  23. return 0;
  24. }

2.3.2 注意事项

        switch后面的表达式是一个变量或者变量表达式
        case只能是一个常量或者常量表达式,二千这个表达式不能是范围
        case后面如果有多条语句,不用加{}
        switch语句中只能判断整形数据和字符型数据,不能是浮点型或者字符串
        default后面可以不加break
        break主要是为了结束switch语句,如果不加,从指定case语句之后一直向下执行所有语句块,直到遇到break为止。

三、循环语句

        我们在写代码中,往往会出现有些代码可能会执行很多次的情况,那么为了简便书写,可以通过循环来实现,这样可读性,逻辑性都会更好

3.1 while循环

3.1.1 格式

  1. while(表达式)
  2. {
  3. 语句块
  4. }
  5. 注意事项:循环条件不能永远为真,必须要有循环结束的条件,如果永远循环,将其称之为死循环,例如while(1)

3.1.2 循环的简单使用

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main(int argc, const char *argv[])
  4. {
  5. /*
  6. while(1)
  7. {
  8. printf("helloworld\n");
  9. sleep(1);
  10. }*/
  11. int i = 5;
  12. while(i--)
  13. {
  14. printf("helloworld\n");
  15. }
  16. //程序员40W,房价200W,10%,如果不涨工资的情况下,不贷款,问多少年可以买房?
  17. int year = 1,sum = 40,price = 200;
  18. while(1)
  19. {
  20. year++;
  21. sum += 40;
  22. price += price*0.1;
  23. if(sum >= price)
  24. {
  25. printf("第%d年买房\n",year);
  26. break;
  27. }
  28. printf("第%d年买不起房\n",year);
  29. }
  30. return 0;
  31. }

3.1.3 do..while..使用

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4. //do..while循环会先执行一次,然后再判断,所以不管表达式是否为假,都会先执行一次
  5. do
  6. {
  7. printf("hello world!\n");
  8. }while(0);
  9. return 0;
  10. }

3.2 for 循环

3.2.1 格式

  1. for(表达式1;表达式2;表达式3)
  2. {
  3. 语句块
  4. }
  5. 执行顺序:先执行表达式1,执行完毕后执行表达式2,如果表达式2为真,则执行语句块,执行完语句块后

        注意:for循环和while循环是通用的

  1. int i = 0;
  2. while(i < 10)
  3. {
  4. i++;
  5. }
  6. for(i = 0; i < 10;i++)
  7. {
  8. ...
  9. }

3.2.2 for循环的注意事项

  1. for(表达式1;表达式2;表达式3)
  2. {
  3. 语句块;
  4. }
  5. 1.表达式1:主要对要计数的变量赋初值,整个循环只执行一次,也可以省略不写
  6. 2.不管省略哪个表达式,分号不能丢
  7. 3.表达式2主要是判断条件,条件为真执行语句块,条件为假循环结束,如果省略表达式2不写,会造成死循环
  8. for(i = 0;;i++)
  9. 4.表达式3就是为了改变计数变量的值从而影响循环的次数,如果省略表达式3不写,会造成死循环,当然可以把表达式3放在语句块中农
  10. 死循环:for(;;);

3.2.3 for循环的使用

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. int i;
  5. /*
  6. for(i = 0,printf("i = %d\n",i);i < 5,printf("i = %d\n",i);i++,printf("i = %d\n",i))
  7. {
  8. printf("hello world!\n");
  9. }*/
  10. int j;
  11. for(j = 0 ;j < 3;j++)
  12. {
  13. for(i = 0 ; i < 5;i++)
  14. {
  15. if(1 == i)
  16. {
  17. continue; //结束本次循环,继续下一次循环
  18. // break; //结束这一层循环
  19. }
  20. printf("hello world! %d\n",i);
  21. }
  22. printf("hello nanjing\n");
  23. }
  24. return 0;
  25. }

3.2.4 打印100-1000以内的所有的水仙花数

        水仙花数:是指一个三位数的每一位的立方和等于这个数,则这个数称之为水仙花数

num = 个位的立方+十位的立方+百位数的立方

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i;
  5. int g, s, b;
  6. for(i=100;i<1000;i++)
  7. {
  8. g = i % 10;
  9. s = i / 10 % 10;
  10. b = i / 100;
  11. if(i == g*g*g + s*s*s + b*b*b)
  12. {
  13. printf("the number is:%d\n",i);
  14. }
  15. }
  16. return 0;
  17. }

四 辅助控制关键词

4.1 goto

        goto主要用于在一个函数内进行跳转,可以跳转到当前函数的任意位置

注意:不建议过多使用,可读性,逻辑性会变差

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. #if 0
  5. int num = 100;
  6. printf("111111111111111111111111\n");
  7. goto NEXT;
  8. printf("hello world!\n");
  9. num = 888;
  10. printf("hello nanjing");
  11. NEXT:
  12. printf("hello beijing\n");
  13. printf("num = %d\n",num);
  14. printf("222222222222222222222222222");
  15. #endif
  16. int i = 0;
  17. TEMP:
  18. printf("hello world\n");
  19. i++;
  20. if(i <= 9)
  21. {
  22. goto TEMP;
  23. }
  24. return 0;
  25. }

4.2 break

        break在switch语句中主要用于结束指定的语句块
        break主要在循环语句中使用,功能是结束本次循环
注意:break除了在switch语句中以外,其它地方只能在循环中使用

4.3 continue

        continue只能在循环中使用,表示退出本次循环,下次循环接着运行

4.4 return

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. int i;
  5. for(i = 1;i <= 10;i++)
  6. {
  7. if(i == 5)
  8. {
  9. return i;
  10. }
  11. printf("i = %d\n",i);
  12. }
  13. printf("hello world!\n");
  14. return 0;
  15. }

        这里会返回i而不会返回0

五 数组

5.1 数组的概念

        数组:

保存一组相同类型的数据

不管是几维数组,都是开辟一段连续的内存空间

数组是一种构造数据类型(数组,结构体,共用体)

5.2 一维数组

5.2.1 一维数组的定义

<存储类型> <数据类型> <数组名> [数组下标]
存储类型:auto,register,static,extern
数据类型:基本数据类型:int,char,float....等
数组名:是一个标识符,满足标识符的命名规则
数组下标:确定数组张元素的个数
例如:
int a[10];
含义:定义一个名为a的数组,一共10个元素,每个元素都是int类型。

5.2.2 一维数组的性质

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. int a[4];
  5. a[0] = 222;
  6. a[1] = 333;
  7. a[2] = 444;
  8. a[3] = 555;
  9. printf("%d %d %d\n",a[0],a[1],a[2]);
  10. //数组在定义和使用的时候,数组下表尽量不要使用变量
  11. //防止后期变量改变会影响对数组的操作,一般数组下标都是常量或者常量表单大师,宏定义本身也是一个常量表达式,所以可以当做数组下标使用
  12. #if 0
  13. int num = 10;
  14. int b[num];
  15. b[2] = 5;
  16. int n =3;
  17. b[n] = 888;
  18. printf("%d %d\n",b[2],b[n]);
  19. #endif
  20. printf("sizeof(a) = %ld %ld\n",sizeof(a),sizeof(int)*4);
  21. printf("%p\n",&a[0]);
  22. printf("%p\n",&a[0]+1);
  23. printf("%p\n",a);
  24. printf("%p\n",a+1);
  25. printf("%p\n",&a);
  26. printf("%p\n",&a+1);
  27. a++; //数组名是常指针,不能修改
  28. return 0;
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/215336
推荐阅读
相关标签
  

闽ICP备14008679号