C语言学习(4)

一、goto和标签

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

    标签的定义:

    名字:

    goto语句和标签配合使用

#include<stdio.h>

int main()
{
    int i;
//定义一个标签
label:
    printf("程序开始运行了!\n");
    for(i=0; i<5; i++)
        printf("hello gec!\n");
    printf("程序准备退出了!\n");
    //本来程序即将退出,我强行跳转到起始位置再来执行
    //goto label;  //往前面跳转
    goto label2; //往后跳转
    printf("中间还有代码111!\n");
    printf("中间还有代码222!\n");
    printf("中间还有代码333!\n");
    printf("中间还有代码444!\n");
label2:
    printf("我成功跳过了中间部分的代码!\n");
    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\n",a);
    //由于数组是连续存储的,还可以一个个字符打印
    for(i=0; i<10; i++)
        printf("%c\n",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\n",a);
    
    //第三种(常规写法)
    char b[10]={'h','e','l'}; //b[0]--b[2]
    printf("b is %s\n",b);
    
    //第四种(非常规写法)
    char c[10]={'y',[3 ... 5]='h','p'};
    printf("c is %s\n",c);
    for(i=0; i<10; i++)
        printf("c[%d] is:%c 对应的ASCII码值是:%d\n",i,c[i],c[i]);
    
    //第五种(常规写法)
    char d[10];
    d[0]='w';
    d[1]='o';
    printf("d is:%s\n",d);
    
    //第六种(非常规写法)
    char e[10];
    0[e]='g'; //常规写法 e[0]
    1[e]='e';
    2[e]='c';
    printf("e is:%s\n",e);
}

 

  字符串的结束标记:

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

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

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

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

 

 

 

    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]!='\0'; i++)  //写法二
    {
        
    }
    char buf[50]="hello\0world";
    printf("%s",buf);
    for(i=0; i<50; i++)
        printf("数组中字符是:%c 对应的ASCII码值是:%d\n",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\n",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("请输入一个字符串!\n");
    scanf("%s",buf);
    
    printf("字符串原本的内容是:%s\n",buf);
    
    //逆序保存 buf[0]--buf[最后一个字符]
    printf("sizeof求出来的是整个数组的长度:%lu\n",sizeof(buf));
    //自己动手求出刚才你输入的字符串实际长度
    for(i=0; i<50; i++) //遍历整个数组
    {
        if(buf[i]!=0)
            count++;
        else
            break;
    }
    printf("字符串的长度是:%d\n",count);
    printf("直接使用strlen求出字符串的实际长度:%d\n",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\n",buf);

 

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

  754

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

int main()
{
    int sum, i = 0;
    char sz[100], temp;
    printf("请输入一个整数:\n");
    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("\n%s\n", sz);
}

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

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

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

  字符串的拼接 strcat()

  字符串的比较 strcmp()

  \n \t \0 \b都是一个字符

#include <stdio.h>
#include <string.h>
int main()
{
    int i;
    int a[10];
    for (i = 0; i < 10; i++)
        printf("a[i] %d\n", a[i]);
    char buf1[20] = {0}; //数组如果没有赋值,它里面存放的是垃圾数(随机数)
    char buf2[20] = {0};

    printf("请从键盘输入字符串!\n");
    scanf("%s", buf1);
    scanf("%s", buf2);
    printf("合并之前: buf1 is:%s  buf2 is:%s\n", buf1, buf2);
    //字符串的拼接
    //strcat(buf1,buf2); //把buf2和buf1合并成一个新的字符串,然后保存到buf1中
    //printf("合并之后: buf1 is:%s  buf2 is:%s\n",buf1,buf2);

    //字符串的比较,不是根据长度比较,根据字符串中字母的排列顺序比较
    int ret = strcmp(buf1, buf2); // abc   aet
    if (ret > 0)                  //说明buf1大于buf2
    {
        printf("buf1大于buf2\n");
    }
    else if (ret < 0) //说明buf1小于buf2
    {
        printf("buf1小于buf2\n");
    }
    else //说明buf1等于buf2
        printf("buf1等于buf2\n");

    //拷贝一个字符串的前面n个字节
    char buf3[20] = {0};
    strncpy(buf3, "hello", 2); //把hello最前面的2个字节数据拷贝到buf3中
    printf("buf3 is:%s\n", buf3);
}

 

四、作业:

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

#include <stdio.h>

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

int main()
{
    int i, j, a[10], cup;
    printf("请输入10个不同数据:\n");
    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("\n");
    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] = '\0';
    printf("%s\n", 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("请输入一个小数!\n");
    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\n", 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\n", buf1);
}
View Code

 

posted @ 2020-03-06 17:29  Geek_Jian  阅读(290)  评论(0编辑  收藏  举报