DAY7 C基础:一维字符数组函数、二维数组

一、一维字符数组

【1】字符串函数族的函数

i)strlen

ii)strcpy

iii)strcat

以上详见DAY6

iv)strcmp

两个字符串比较

原型:  int strcmp(const char *s1, const char *s2);

功能:    比较两个字符串的大小

参数:    字符串的地址

结果:

s1>s2:   正数, s1-s2,   ascii的值

s1<s2:   负数, s1-s2,   ascii的值

s1=s2:   0

执行逻辑:

按位比较,碰见不同的位就结束函数返回结果,如果每一位都相同,遇到'\0'结束函数,返回结果。

练习:

1、尝试实现strcmp函数

#include <stdio.h>
int main(int argc, const char *argv[])
{
    char str[20] = "hell";
    char str1[10] = "h";
    int i = 0,ret;
    //如果两个字符串相等并且都没有走到'\0'的时候向后走
    while(str[i]==str1[i]&&str[i]!='\0')
    {
        i++;
    }

    //如果不满足条件说明两个字符不相等,说明有两个或者是有一个走到的'\0',
    //计算差值 结束判断
 ret = str[i]-str1[i];
    printf("%d\n",ret);
    return 0;
}

方法2:

#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
    char str[20] = "hell";
    char str1[10] = "hell";
    int i = 0,ret;

    //通过判断字符串长度,实现strcmp
    while(str1[i])  //如果str1没有走到'\0'
    {
        if(str[i]!=str1[i])
        {
            ret = str[i]-str1[i]; 
            break;
        }
        i++;
    }
    if(str1[i]=='\0')  //判断上面的while循环是否正常退出
    {
        ret=str[i]-str1[i];
    }

    printf("%d\n",ret);

    return 0;
} 

2、终端输入带空格的字符串,实现字符串的逆置/一维字符数组的逆置

#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
    char str[30] = "hello";  //数组的不完全初始化
    gets(str);
    int len = strlen(str);  //求出str的真实长度
    //<==>int arr[5]里面的5

    int i = 0;
    char temp;
    while(i<len/2)
    {
        temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = temp;
        i++;
    }

    puts(str);
    return 0;
}

终端输入带空格的字符串,求单词的个数

#include <stdio.h>
int main(int argc, const char *argv[])
{
    char str[100]="";   //把str中的每一个字节都初始化'\0'
    gets(str);
    int count = 0,i=0;

    //遍历字符串
    while(str[i])  //n次
    {
        //如果第i位是空格,第i+1位不是空格,说明是一个单词
        if(str[i]==' '&&str[i+1]!=' '&&str[i+1]!='\0')
        {
            count++;
        }
        i++;
    }

    //把字符串起始位置就是单词的情况包括进来
    if(str[0]!=' ')
    {
        count++;
    }
    printf("%d\n",count);
    return 0;
}

终端输入带空格的字符串,删除字符串中的空格,要求使用一个数组

#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
    char str[100]="";   //把str中的每一个字节都初始化'\0'
    gets(str);

    int i,j;
    int len = strlen(str);
    //第一个for循环,遍历字符串本身包括结尾的'\0'
    for(i=0;i<=len;i++)
    {
        //如果字符串中遇到空格了
        if(str[i]==' ')
        {
            //循环把空格后面的字符向前覆盖
            for(j=i;j<len;j++)
            {
                str[j]=str[j+1];
            }

            //i--因为,从后面赋过来的字符串也可能是空格
            i--;
            //已经被覆盖了,长度改变了
            len--;
        }
    }

    /*char str1[] = "hello ";
    puts(str1);*/

    puts(str);
    return 0;
}

二、二维数组

整形二维数组

 【1】定义

存储类型 数据类型[行数][列数];

【2】初始化和赋值

#include <stdio.h>

int main(int argc, const char *argv[])

{

int arr[2][3]={1,2,3,4,5,6};

//定义了一个二维数组arr能存6个整形数据,并完全初始化

int arr1[2][3]={1,2,3,4};

//定义了一个二维数组arr1能存6个整形数据,不完全初始化,未初始化的部分全部为0

int arr2[2][3]={{1,2,3},{2,4,5}};

//定义了一个二维数组arr2能存6个整形数据,以行为单位的完全初始化

int arr3[2][3]={{1,2},{1,2}};

//定义了一个二维数组arr3能存6个整形数据,以行为单位的不完全初始化,未初始化的部分为0

int arr4[][3]={1,2,3,4,5};

//省略行数的初始化,可以的,根据初始化列表和列数来分配数组的空间

//1,2,3存在二维数组的第一行,4,5存在二维数组的第二行

int arr5[2][3]={0};

//把二维数组中的每个元素都初始化为0 //

int arr5[3][] = {1,2,3,};

//error,不可以省略列数的初始化

printf("%ld\n",sizeof(arr4));

//二维数组中元素的个数

int count = sizeof(arr)/sizeof(arr[0][0]);

printf("%d\n",count);

return 0;

}

【3】二维数组的大小

行数*列数*元素的大小

二维数组中元素的个数:行数*列数

【4】二维数组中元素的访问

数组名[行标][列标];

由于数组中下标是从0开始的,所以最大行标是:行数-1

最大列标:列数-1

int arr[2][3]={1,2,3,4,5,6};

arr[0][0];

练习:

1、使用for循环,实现二维数组中元素的输出,以及元素的地址。

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int arr[2][3]={12,3,4,5,6,78};
    int i,j;

    //外层循环,循环二维数组的每一行
    for(i=0;i<2;i++)
    {
        //内层循环,循环二维数组的每一列
        for(j=0;j<3;j++)
        {
            printf("%d\t%p\n",arr[i][j],&arr[i][j]);
        }
    }
    return 0;
}

2、终端输入二维数组中的元素,求二维数组中最大值,及其行标列标

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int arr[2][3];

    int i,j;
    //循环输入数组中元素
    for(i=0;i<2;i++)
    {
        for (j=0;j<3;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }

    //求最大值
    int max = arr[0][0];
    for(i=0;i<2;i++)
    {
        for (j=0;j<3;j++)
        {
            if(arr[i][j]>max)
            {
                max = arr[i][j];
            }
        }
    }

    printf("最大值%d\n",max);
    return 0;
}

作业:

1.终端输入二维数组中的元素,求二维数组中第二大值,及其行标列标

 

2.整理思维导图

 

3.给定一个字符串“I love china”,编写程序完成以单词为单位的逆序,如“china love i”,并要求不允许使用第三方变量保存数据,但可以使用辅助指针变量等。要求:不许使用数下标的方式完成。

4.输出杨辉三角

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中的代码片段展示了如何使用C语言中的strcpy函数将一个二维数组复制到另一个数组中。在这个例子中,数组a为一个3行1列的二维数组数组d为一个1行3列的二维数组。首先,通过循环将数组a中的元素输入。然后,通过嵌套的循环将数组a的元素复制到数组d中,并使用printf函数打印出复制后的结果。可以看到,strcpy函数被用来复制数组元素。 引用中的代码片段展示了如何使用C语言中的strcpy函数对一个二维数组进行排序。在这个例子中,数组arr为一个5行10列的二维数组,包含了一些字符串。通过调用sort_arr函数,可以对这些字符串进行冒泡排序。在排序过程中,使用strcmp函数比较字符串的大小,如果前一个字符串大于后一个字符串,则交换它们的位置。最后,通过调用print_arr函数,可以打印出排序后的数组。 综上所述,strcpy函数是C语言中用于复制字符串的函数,可以用来复制二维数组中的元素。在引用和引用中,它们分别展示了将二维数组复制到另一个数组和对二维数组进行排序时的应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [初学C语言-二维数组字符数组](https://blog.csdn.net/czh2637750821/article/details/110200445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Day 24 C语言学习 二维字符数组 练习](https://blog.csdn.net/qq_59947178/article/details/126770876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值