C语言——数组和字符串

本文详细介绍了C语言中数组(一维、二维、三维)的定义、初始化方法,以及数组的传参、数据操作(如求和、插入、查找、删除),还有冒泡排序和二分查找等算法的应用,以及字符串与字符数组的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 数组的定义

int parr['A'];      //'A'-->65

二 数组的初始化

一维数组

int array[4];
printf("数组名:%p\n", array);
printf("数组名:%p\n", &array[0]);
数组名是第一个元素的地址
    
数组只能在定义时初始化

二维数组

int a[3][]=   定义二维数组必须指定二维长度
 不能超过数组下标范围
    
二维数组传参
void print_array(int arr[][3], int row, int cols) 
{
    for (int i = 0; i < row; i++) 
    {
        for (int j = 0; j < cols; j++) 
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }    
str[i]代表的第i行的首地址
printf("%s", str[i]);   

二维数组的常规操作

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
    //1.通过下标的一致性做表格做表格数据处理
    //这种写法做编程不会用,更多用的结构体
    char name[3][10] = { "小芳","小妹","小帅" };
    double score[3][4] = { 88,89,88,34,45,67,99,99,98,56,78,99 };
    int row = 3;
    int cols = 4;
    printf("姓名\t数学\t英语\t体育\t思想\n");
    for (int i = 0; i < row; i++)
    {
        printf("%s\t", name[i]);
        for (int j = 0; j < cols; j++)
        {
            printf("%.1lf\t", score[i][j]);
        }
        printf("\n");
    }
    //衍生出一些表格操作
    double rowSum[3] = { 0 };
    double colsSum[4] = { 0 };
    for (int i = 0; i < row; i++)   
    {
        for (int j = 0; j < cols; j++)
        {
            rowSum[i] += score[i][j]; 
            //rowSum[0] += score[0][0]; 
            //rowSum[0] += score[0][1]; 
            //rowSum[0] += score[0][2];
            //rowSum[0] += score[0][3];
        }
    }
    //求列的和
    for (int j = 0; j < cols; j++) 
    {
        for (int i = 0; i < row; i++) 
        {
            colsSum[j]+= score[i][j];
        }
    }
​
    printf("姓名\t数学\t英语\t体育\t思想\t总分\n");
    for (int i = 0; i < row; i++)
    {
        printf("%s\t", name[i]);
        for (int j = 0; j < cols; j++)
        {
            printf("%.1lf\t", score[i][j]);
        }
        printf("%.1lf\n",rowSum[i]);
    }
    printf("总分\t");
    double sum = 0.;
    for (int i = 0; i < cols; i++) 
    {
        sum += colsSum[i];
        printf("%.1lf\t", colsSum[i]);
    }
    printf("%.1lf\n",sum);


​

    //2.做地图
    //特定数组字表示特定含义
    int map[9][9] =
    {
        1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,
        1,1,0,0,1,0,0,1,1,
        1,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,1,
        1,1,0,0,0,0,0,1,1,
        1,1,1,0,0,0,1,1,1,
        1,1,1,1,0,1,1,1,1,
        1,1,1,1,1,1,1,1,1
    };
​
    for (int i = 0; i < 9; i++) 
    {
        for (int j = 0; j < 9; j++) 
        {
            switch (map[i][j]) 
            {
            case 0:
                printf("心");
                break;
            case 1:
                printf("  ");
                break;
            }
        }
        printf("\n");
    }
    return 0;
}

三维数组

三 数组的使用

输入和打印

1
for (int i = 0; i < 3; i++) 
{
    scanf_s("%d", &sum[i]);  //sum[0] sum[1] sum[2]
}
for (int i = 0; i < 3; i++) 
{
    printf("%d\t", sum[i]);
}
printf("\n");
​
2    
printf("双精度数组:\n");
double dnum[3] = { 1.1,2.3,4.4 };
for (int i = 0; i < 3; i++) 
{
    printf("%.2lf\t", dnum[i]);
}
​
3
printf("\n字符数组:\n");
char cnum[4] = { 'A','B','C','D' };
for (int i = 0; i < 3; i++) 
{
    //printf("%c",cnum[i]);
    putchar(cnum[i]);
}
printf("\n");

求和

//求和
int money[4] = { 100,200,300,400 };
int sum = 0;
for (int i = 0; i < 4; i++) 
{
    sum += money[i];
}
printf("和:%d\n", sum);

插入

//插入
//用户输入数据,输入到-1结束
printf("input num:");
int data[100] = { 0 };
int curSize = 0;            //记录当前数组中有多少元素
while (true) 
{
    int key = 0;
    scanf_s("%d", &key);
    if (key == -1)
        break;
    data[curSize++] = key;
}
printf("your data:");
for (int i = 0; i < curSize; i++) 
{
    printf("%d\t", data[i]);
}
​
​
//调整数组,保持数组的有序性插入
    for (int i = curSize - 1; i > 0; i--) 
    {
        //细节,数组下标做了i+n 或者i-n操作
        //考虑临界值 
        if (data[i] < data[i - 1]) 
        {
            //交换
            int temp = data[i];
            data[i] = data[i - 1];
            data[i - 1] = temp;
        }
        else
        {
            break;
        }
    }

查找

//查找
int pos = -1;           //因为数组有0下标
printf("\ninput searchData:");
int posData = 0;
scanf_s("%d", &posData);
for (int i = 0; i < curSize; i++) 
{
    if (data[i] == posData) 
    {
        pos = i;
        break;
    }
}
printf("查找元素的数组下标:%d\n", pos);
​
​
//修改,找到指定元素的下标,直接修改
//data[pos] = 124;

删除

//数组删除
//伪删除(计数变量的改变)
//删除操作一定考虑是否找到
if (pos != -1) 
{
    //假设curSize=4
    //覆盖删除的元素
    for (int i = pos; i < curSize-1; i++) 
    {
        //i=3  i+1=4
        data[i] = data[i + 1];
    }
    //真正的删除
    curSize--;
}
printf("删除元素:%d后的结果:\n", posData);
for (int i = 0; i < curSize; i++)
{
    printf("%d\t", data[i]);
}
printf("\n");

冒泡排序

//冒泡排序
int arr[10] = { 0,1,2,3,4,9,8,7,6,5 };
int length = 10;
for (int i = 0; i < length; i++) 
{
    for (int j = 0; j < length -1-i; j++) 
    {
        if (arr[j] > arr[j+1]) 
        {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
printf("冒泡排序结果:\n");
for (int i = 0; i < length; i++) 
{
    printf("%d\t", arr[i]);
}

四 算法---有序数组的特殊操作

二分查找

int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int length = 10;
//二分查找法
int left = 0;
int right = length - 1;
int pos = -1;
int posData = 2;
while (left < right)
{
    int mid = (left + right) / 2;
    if (arr[mid] == posData) 
    {
        pos = mid;
        break;
    }
    else if (arr[mid] > posData) 
    {
        right = mid-1;
    }
    else
    {
        left = mid + 1;
    }
}
printf("pos:%d\n", pos);

归并算法

//归并算法
int one[4] = { 1,3,5,7 };
int two[3] = { 2,4,6 };
int result[10];
int count = 0;
int lengthOne = 4;
int lengthTwo = 3;
int i = 0;
int j = 0;
while (i < lengthOne && j < lengthTwo) 
{
    if (one[i] < two[j]) 
    {
        result[count++] = one[i++];
    }
    else 
    {
        result[count++] = two[j++];
    }
}
while (i < lengthOne) 
{
    result[count++] = one[i++];
}
while (j < lengthTwo) 
{
    result[count++] = two[i++];
}
​
for (int i = 0; i < count; i++) 
{
    printf("%d\t", result[i]);
}

找素数

五 字符串与字符数组

六 字符数组操作字符串

%s的工作方式,从首地址开始打印到\0;
1.字符打印
char str1[] = { 'A',' ','B','\0','D','E' };
printf("%s\n", str1);
printf("%s\n", &str1[0]);
printf("%s\n", &str1[2]);
​
​
2.可以直接用字符串给字符数组做初始化
char str2[] = "ILoveyou";       //知道数组长度是多少? 9
printf("数组长度:%zd\n", sizeof(str2) / sizeof(char));
​
​
3.没有\0的串打印会怎么样
//ABC烫烫烫烫烫烫烫烫烫烫烫烫贪鰪*? 没有字符串结束标记
char str3[] = { 'A','B','C' };
printf("%s\n", str3);
​
4.字符串常用操作
4.1 字符串输入输出
char inputstr[100];
//scanf("%s",inputstr);
int number = 0;
printf("输入一个整数:\n");
scanf_s("%d", &number);
printf("请输入一个字符串:");
//scanf函数只接受空格之前的内容
scanf_s("%s", inputstr, 100);
printf("input:%s\n", inputstr);
printf("------\n");
//gets函数可以接受带空格的数据
printf("请输入一个字符串:");
while (getchar() != '\n');  //清楚缓冲区 解决字符输入跳过现象
gets_s(inputstr, 100);      //字符串输入函数
printf("input:%s\n", inputstr);
printf("------\n");
puts(inputstr);             //字符串输出函数
puts("自带换行");
​
4.2字符串常用操作
//求一个字符串可见长度
char str[] = "ILoveyou";
//通常操作字符串用的while循环
int count = 0;
while (str[count] != '\0') 
{
    count++;
}
printf("可见长度:%d\n", count);
​
4.3 字符串数组覆盖
char one[10] = "sdf23234";
char two[10] = "0000";
int i = 0;
while (two[i] != '\0') 
{
    one[i] = two[i];
    i++;
}
one[i] = '\0';              //一定要处理
printf("one=%s\n",one);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值