zoukankan      html  css  js  c++  java
  • C语言学习(4)

    一、goto和标签

      1. 作用: 帮助我们实现代码的跳转

        标签的定义:

        名字:

        goto语句和标签配合使用

    #include<stdio.h>
    
    int main()
    {
        int i;
    //定义一个标签
    label:
        printf("程序开始运行了!
    ");
        for(i=0; i<5; i++)
            printf("hello gec!
    ");
        printf("程序准备退出了!
    ");
        //本来程序即将退出,我强行跳转到起始位置再来执行
        //goto label;  //往前面跳转
        goto label2; //往后跳转
        printf("中间还有代码111!
    ");
        printf("中间还有代码222!
    ");
        printf("中间还有代码333!
    ");
        printf("中间还有代码444!
    ");
    label2:
        printf("我成功跳过了中间部分的代码!
    ");
        return 0;
    }

    二、C语言中的数组

      作用:

        存放多个相同类型的数据

      定义数组:

        类型名字 数组名[数组的大小]

        例如: int a[10]; // 定义了数组名叫a,最多允许存放10个int类型的数据

            float b[7]; //定义float类型数组,最多存放7个小数

            char c[8]; //定义char类型数组,最多存放8个字符,开发中使用频率最高,保存字符串 "hello"(字符用单引号,字符串用双引号)

      数组的大小:

        sizeof求数组的大小 sizeof(a) sizeof(b)

      数组的初始化和赋值:

        以char类型数组为例:

          char c[10]="hello"; //定义数组立马初始化

          char c[10]; //定义数组,没有初始化

          c="hello"; //典型错误,char类型数组赋值不能直接用=(赋值符号)

          strcpy(c,"hello");

          char c[10]={'h','e','l'}; //定义数组立马初始化,一个个字符依次初始化

    #include <stdio.h>
    
    int main()
    {
        int i;
        //定义char类型的数组
        //定义数组立马初始化
        char a[10]="hello";  //定义char类型数组,同时将hello字符串保存到该数组中
        //打印
        printf("%s
    ",a);
        //由于数组是连续存储的,还可以一个个字符打印
        for(i=0; i<10; i++)
            printf("%c
    ",a[i]);
        
    }

      数组的下标:

        a[0] ......a[n] //数组下标从0开始

      数组部分初始化:

        数组部分初始化,那么没有初始化的,系统默认全部都填充0

        char类型数组求字符串实际长度

        strlen(); 比如: strlen(buf); //求出buf中存放的字符串的实际长度

        strlen和sizeof区别

        sizeof可以求C语言中所有合法类型变量的大小

        strlen只能用于求字符串的实际长度,其他类型的变量不能用strlen

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int i;
        char a[10]; //(常规写法)
        //a="hello";  错误//定义数组的没有赋初始化,char类型数组只能使用
        strcpy(a,"hello"); //把字符串hello拷贝到数组a中
        printf("a is:%s
    ",a);
        
        //第三种(常规写法)
        char b[10]={'h','e','l'}; //b[0]--b[2]
        printf("b is %s
    ",b);
        
        //第四种(非常规写法)
        char c[10]={'y',[3 ... 5]='h','p'};
        printf("c is %s
    ",c);
        for(i=0; i<10; i++)
            printf("c[%d] is:%c 对应的ASCII码值是:%d
    ",i,c[i],c[i]);
        
        //第五种(常规写法)
        char d[10];
        d[0]='w';
        d[1]='o';
        printf("d is:%s
    ",d);
        
        //第六种(非常规写法)
        char e[10];
        0[e]='g'; //常规写法 e[0]
        1[e]='e';
        2[e]='c';
        printf("e is:%s
    ",e);
    }

      字符串的结束标记:

        C语言规定,字符串必须用双引号括起来,并且字符串有结束标记'',用来标记字符串的结尾

        我们在使用char类型数组的时候,需要多定义一个字节的空间留给

        char a[5]="hello"; //不建议你这么写,没有位置

        char a[6]="hello"; //给留了一个空间

        int b[2]={18,17};

    int main()
    {
        int i;
        char other[10]="china";
        //for(i=0; i<strlen(other); i++) //写法一
        for(i=0; other[i]!=''; i++)  //写法二
        {
            
        }
        char buf[50]="helloworld";
        printf("%s",buf);
        for(i=0; i<50; i++)
            printf("数组中字符是:%c 对应的ASCII码值是:%d
    ",buf[i],buf[i]);
    }

      数组越界:

        任何一个数组a[n],它都有自己的范围 a[0]-----a[[n-1]

        越界可能会产生段错误(你超出了系统分配给你的内存区域)

    #include <stdio.h>
    
    int main()
    {
        int i;
        int a[5]={18,15,89,7856,93,96,7852,741}; //已经越界了
        for(i=0; i<10; i++)
            printf("a[%d]  %d
    ",i,a[i]);
    }

      练习:

      1. 从键盘中输入一个字符串保存到char类型数组,请你将它逆序存放

      hello --》olleh

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int i;
        int count=0;
        int temp;
        //定义数组存放字符串
        char buf[50];
        printf("请输入一个字符串!
    ");
        scanf("%s",buf);
        
        printf("字符串原本的内容是:%s
    ",buf);
        
        //逆序保存 buf[0]--buf[最后一个字符]
        printf("sizeof求出来的是整个数组的长度:%lu
    ",sizeof(buf));
        //自己动手求出刚才你输入的字符串实际长度
        for(i=0; i<50; i++) //遍历整个数组
        {
            if(buf[i]!=0)
                count++;
            else
                break;
        }
        printf("字符串的长度是:%d
    ",count);
        printf("直接使用strlen求出字符串的实际长度:%d
    ",strlen(buf));
        for(i=0; i<count/2; i++)  // buf[0]  buf[count-1]
        {
            temp=buf[i];
            buf[i]=buf[count-(i+1)];
            buf[count-(i+1)]=temp;
        }
        printf("逆序之后buf是:%s
    ",buf);

      2. 从键盘输入任意一个数,求出它的二进制,然后把这个二进制保存到char binary[32]中

      754

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int sum, i = 0;
        char sz[100], temp;
        printf("请输入一个整数:
    ");
        scanf("%d", &sum);
        do
        {
            sz[i] = sum % 2 + '0'; //整型转字符型,将整数的值+48,‘0’的ASCII码值
            //printf("%d",sz[i]);
            i++;
            sum /= 2;
            //printf("%d",sz[i]);
        } while (sum != 0);
    
        for (i = 0; i < strlen(sz) / 2; i++)
        {
            temp = sz[i];
            sz[i] = sz[strlen(sz) - 1 - i];
            sz[strlen(sz) - 1 - i] = temp;
        }
        printf("
    %s
    ", sz);
    }

    三、C语言提供的关于字符串操作的常用函数

      求字符串的实际长度 strlen()

      字符串的拷贝 strcpy()和strncpy()

      字符串的拼接 strcat()

      字符串的比较 strcmp()

       都是一个字符

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int i;
        int a[10];
        for (i = 0; i < 10; i++)
            printf("a[i] %d
    ", a[i]);
        char buf1[20] = {0}; //数组如果没有赋值,它里面存放的是垃圾数(随机数)
        char buf2[20] = {0};
    
        printf("请从键盘输入字符串!
    ");
        scanf("%s", buf1);
        scanf("%s", buf2);
        printf("合并之前: buf1 is:%s  buf2 is:%s
    ", buf1, buf2);
        //字符串的拼接
        //strcat(buf1,buf2); //把buf2和buf1合并成一个新的字符串,然后保存到buf1中
        //printf("合并之后: buf1 is:%s  buf2 is:%s
    ",buf1,buf2);
    
        //字符串的比较,不是根据长度比较,根据字符串中字母的排列顺序比较
        int ret = strcmp(buf1, buf2); // abc   aet
        if (ret > 0)                  //说明buf1大于buf2
        {
            printf("buf1大于buf2
    ");
        }
        else if (ret < 0) //说明buf1小于buf2
        {
            printf("buf1小于buf2
    ");
        }
        else //说明buf1等于buf2
            printf("buf1等于buf2
    ");
    
        //拷贝一个字符串的前面n个字节
        char buf3[20] = {0};
        strncpy(buf3, "hello", 2); //把hello最前面的2个字节数据拷贝到buf3中
        printf("buf3 is:%s
    ", buf3);
    }

    四、作业:

    1. 定义int数组,任意输入10个整数,对它们从小到大排序

    #include <stdio.h>
    
    /*
    * 1.  定义int数组,任意输入10个整数,对它们从小到大排序
    */
    
    int main()
    {
        int i, j, a[10], cup;
        printf("请输入10个不同数据:
    ");
        for (i = 0; i < 10; i++)
        {
            scanf("%d", &a[i]);
        }
        for (i = 0; i < 9; i++)
        {
            for (j = i + 1; j < 10; j++)
            {
                if (a[i] > a[j])
                {
                    cup = a[i];
                    a[i] = a[j];
                    a[j] = cup;
                }
            }
        }
        printf("排列顺序从小到大为:");
        for (i = 0; i < 10; i++)
        {
            printf("%d  ", a[i]);
        }
        printf("
    ");
        return 0;
    }
    View Code

    2. 任意输入一个字符串,要求去除掉这个字符串中重复的字符(重复字符只保留一个);

    google --》gole

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str[100];
        char c;
        int len = 0;
        int i, j, k;
        scanf("%s", str);
        len = strlen(str);
    
        for (i = 0; i <= len - 1; i++)
        {
            for (j = i + 1; j <= len - 1; j++)
            {
                if (str[i] == str[j])
                {
    
                    for (k = j; k <= len - 1; k++) //将这个字符丢掉,将后面的字符向前移动
                    {
                        str[k] = str[k + 1];
                    }
                    len--; //字符长度减少
                    j--;   //重新匹对
                }
            }
        }
        str[len] = '';
        printf("%s
    ", str);
        return 0;
    }
    View Code

    3. 编写程序,把你输入带2位小数的数字,转换成字符串保存到一个字符数组中

    scanf("%f",) 15.23

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int i = 0;
        int count = 0;
        char buf1[20] = {0}; //存放整数部分的数组
        char buf2[10] = {0}; //存放小数部分的数组
        char temp;
        float a;
        int d; //存放整数部分
        printf("请输入一个小数!
    ");
        scanf("%f", &a);
    
        //取整
        int b = (int)a;
        float c = a - b; // 125.68; c=0.8  d=6
        //把整数b转换成字符串存放
        while (b != 0)
        {
            buf1[i++] = b % 10 + '0';
            b /= 10;
        }
        //将存放的字符颠倒回来
        for (i = 0; i < strlen(buf1) / 2; i++) // buf[0]  buf[count-1]
        {
            temp = buf1[i];
            buf1[i] = buf1[strlen(buf1) - (i + 1)];
            buf1[strlen(buf1) - (i + 1)] = temp;
        }
        //小数部分
        buf2[0] = '.';
        while (c != 0)
        {
            d = (int)(c * 10);
            //printf("小数部分:%d
    ", d);
            c = c * 10 - d;
            count++;
            if (count > 2)
            {
                if (d > 5)
                {
                    buf2[2] = buf2[2] + 1;
                }
                count = 0;
                break;
            }
            buf2[count] = d + '0';
        }
        //拼接字符,并保存在buf1中
        strcat(buf1, buf2);
        printf("%s
    ", buf1);
    }
    View Code
  • 相关阅读:
    170322操作系统定义、功能、位置与历史
    java 多线程
    java 网络编程TCP程序设计
    java 事件处理机制
    java GUI编程
    170321php3第4章 PHP5的基本语法+作业九九乘法表
    170320网络编程 udpclient udpGroupClient
    二叉树线索化
    哈希表
    二叉搜索树
  • 原文地址:https://www.cnblogs.com/xiaojian98/p/12427782.html
Copyright © 2011-2022 走看看