当前位置: 首页 > news >正文

C语言基础(10)【二维数组 字符数组 字符串相关操作】

二维数组

案例

案例1:

  • 需求:二维数组的遍历
  • 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{// 创建一个二维数组,经过论证,二维数据组必须指定列的大小,行的大小可以省略int arr[][3] = {{11},{21,22},{31,32,33}};// 获取二维数组的大小int r_len = sizeof(arr) / sizeof(arr[0]);// 遍历二维数组// 外层循环,遍历行元素(行元素是数组类型)for (int row = 0; row < r_len; row++){// 获取行元素中列元素的个数int c_len = sizeof(arr[row]) / sizeof(int);// 内层循环,遍历列元素(列元素是单一类型)for (int col = 0; col < c_len; col++){// 获取元素printf("%-3d",arr[row][col]); // 意思是获取数组arr第row行第col列}}printf("\n");return 0;
}

案例2:

  • 需求:矩阵的转置(将一个2行3列的数组转换为3行2列的数组)
  • 代码:
#include <stdio.h>
// 定义行和列
#define ROW 2
#define COL 3
int main(int argc,char *argv[])
{// 准备2个数组用来存放转置前后的数列int arr_before[ROW][COL] = {{11,12,13},{14,15,16}};int arr_after[COL][ROW] = {0};// 计算arr_before的大小int r_len = sizeof(arr_before) / sizeof(arr_before[0]);
// int c_len = sizeof(arr_before[0]) / sizeof(arr_before[0][0])// 遍历for (int i = 0; i < r_len; i++){// 计算arr_before中行中的列数int c_len = sizeof(arr_before[i]) / sizeof(int);for (int j = 0; j < c_len; j++){printf("%-4d",arr_before[i][j]);// 转置arr_after[j][i] = arr_before[i][j];}printf("\n");}printf("\n");// 遍历for (int i = 0; i < sizeof(arr_after)/sizeof(arr_after[0]);i++){for (int j = 0; j < sizeof(arr_after[i]) / sizeof(int); j++){printf("%-4d",arr_after[i][j]);}printf("\n");}printf("\n");return 0;
}

字符数组

概念

元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们 C语言中的字符是字节字符。

字节字符:也就是1个字符占1一个字节,在C语言中,我们使用char表示字节。 测试题:

char a = 'A';     // 正确
char b = '1';     // 正确
char c = 65;      // 正确, char支持两种赋值形式,一种是字符,一种是数值,如果是数值表示ASCII码
char d = "A";     // 错误,char字符不能使用双引号。
char e = '卜';    // 错误,中文一个字符超过了一个char

C语言支持字符串常量,不支持字符串变量

语法
char 数组名[容量];     
char 数组名[行容量][列容量];

们前面所学的一维数组和二维数组的语法,只不过数组的数据类型是char而 已。

注意:

​ 如果我们的char数组初始化的时候,没有完全初始化值的时候,空出来的地方使用 \0 进行填 充。大家要注意,这里的 \0 只是起到占位的作用,我们是无法通过 printf 进行输出的。

比如:

char c[8] = {'h','e','l','l','o'};  // 等价于
char c[8] = {'h','e','l','l','o','\0','\0','\0'};
案例
  • 案例1:

    • 需求:输出一个字符序列(I LOVE YOU!)

    • 代码:

    • int main(int argc,char *argv[])
      {// 创建一个数组,用来存储 I LOVE YOU ASCI中32对应的就是空格' 'char arr[10] = {'I',' ','L','O','V','E',32,'Y','O','U'};// 使用for循环遍历数组for(int i = 0; i < sizeof(arr)/sizeof(char); i++){printf("%c",arr[i]);}printf("\n");return 0;
      }
      

案例2:

  • 需求:输出一个用字符组成的菱形图案
  • 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{// 准备数据char arr[5][5] = {{' ',' ','*',' ',' '},{' ','*','*','*',' '},{'*','*','*','*','*'},{' ','*','*','*',' '},{' ',' ','*',' ',' '}};// 遍历数组for (int i = 0;i < sizeof(arr)/sizeof(arr[0]); i++){for (int j = 0; j < sizeof(arr[i])/sizeof(char); j++){printf("%c",arr[i][j]);}printf("\n");}printf("\n");return 0;
}

注意:

①如果定义时,不初始化,元素值不确定

char arr1[2];//此时属于未初始化,元素的值不确定的(随机值),大概率时\0。也有可能是其他值。
char arr2[5] = {'a','b','c'};   // 此时属于不完全初始化,未初始化的元素使用\0进行填充

②如果提供的字符个数大于数组长度,则按照语法错误处理;如果字符个数小于数组长度, 后面的元素自动为空字符(\0)

③ 如果提供的字符个数与数组长度相同,可以省略数组长度,系统会自动确定元素个数,适 合字符较多时。

字符串结束标志

说明

  • C语言规定,字符串以字符 \0 作为结束标志。
  • 编译系统对字符串常量自动加一个 \0 作为结束标志。
  • 程序中往往通过判断 \0 来检测字符串是否结束。
  • \0 的ASCII码是0,不是一个可显示的字符,是“空操作符”,它什么都不做,不会增加有效字 符,仅是一个工程判别的标志。
char c[] = {'h','i'}; // hi
char c[] = {'h','i','\0'}; // hi
char c[] = "hello"; // 实际等价于 hello\0
// \0(空字符),ASCII码是0
// 0 , ASCII码是48
// 空格,ASCII码是32
字符数组的多样表示

我们的char数组可以以数组的形式一个个输出每个字符;我们的char数组也可以以字符串的方式整 体进行输出所有字符。

案例:

#include <stdio.h>
int main(int argc,char *argv[])
{// 字符串的第1种表示:char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};// 字符串的第2种表示:char s2[] = {"hello world"};// 字符串常量默认以\0结尾// 字符串的第3种表示:char s3[] = "hello world";// 输出字符串printf("%s\n%s\n%s\n",s1,s2,s3);return 0;
}

注意:

  • 字符串的长度与字符数组的长度不一定相同。
  • 利用字符串常量可以对字符数组进行初始化,但不能用字符串常量对字符数组赋值。
// 正确演示:利用字符串常量给字符数组初始化
char arr1[6] = "hello";
// 错误演示:用字符串常量为字符数组赋值
char arr2[6];
arr2 = "hello"; 
字符串的基础操作

在用格式化说明符%s进行输入输出时,其输入输出项均为数组名。但在输入时,相邻两个字符串之 间要用空格分隔,系统将自动在字符串最后加上 \0 。在输出时,遇到结束符 \0 作为输出结束标 志。

对于字符串操作,我们需要使用到一些系统提供的函数(API操作)。

字符串输入

scanf

语法:

scanf("%s",数组名)

注意:数组名对应的数组名只能是char类型

注意:采用scanf()进行字符串输入的时候字符串中不能存在空格,否则字符串遇到空格就会结束。

案例:

#include <stdio.h>
int main(int argc,char *argv[])
{// 创建一个数组,用来存放人的名字char name[20];printf("请输入您的名字:\n");scanf("%s",name);// scanf第二个参数需要传递变量地址,如果是数组,数组名就代表数组的首地址,因为
//数组本身是没有空间的,其空间就是元素空间printf("您的姓名是%s\n",name);return 0;
}

注意:采用scanf()进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格就会结束。

fgets

语法:

fgets(数组名,数组容量,stdin);    

功能:

​ 从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一般用12位16进制数表示)

说明:

​ 采用fgets进型字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处理时,我 们可能需要处理 \n

案例:

#include <stdio.h>
int main(int argc,char *argv[])
{// 创建一个数组,用来存放人的名字
char name[20];printf("请输入您的名字:\n");// fgets和scanf只能二选一fgets(name,sizeof(name)/sizeof(name[0]),stdin);printf("您的姓名是%s\n",name);return 0;
}

注意:

​ ①如果输入的字符串不包括空格或者是换行:可以是scanf||fgets

​ ②如果输入的字符串需要包含空格或换行只能用 fgets

​ ③ 经过对比,我们发现,在字符串输入中,fgets和scanf相比,fgets友好一些

gets危险的

语法:

gets(数组名);

功能:

​ 从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一 般用12位16进制数表示)

说明:

​ 采用gets进行字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处理时,我 们可能需要处理 \n

#include <stdio.h>
int main(int argc,char *argv[])
{// 创建一个数组,用来存放人的名字char name[20];printf("请输入您的名字:\n");// fgets和scanf只能二选一fgets(name,sizeof(name)/sizeof(name[0]),stdin);printf("您的姓名是%s\n",name);return 0;
}
字符串输出

printf

语法:

printf("%s",数组名);

相关文章:

  • CangjieMagic 智能体框架嵌入式系统实测:以树莓派 4B 为例
  • 探秘Transformer系列之(35)--- 大模型量化基础
  • Linux学习笔记:shell脚本篇(1)
  • 相机Camera日志分析之二十三:高通相机Camx 基于预览1帧的process_capture_request二级日志分析详解
  • 设计模式——迭代器设计模式(行为型)
  • SystemVerilog—Interface语法(一)
  • NX847NX855美光固态闪存NX862NX865
  • Spring AI 之检索增强生成(Retrieval Augmented Generation)
  • Python打卡训练营Day43
  • 系统思考:成长与投资不足
  • 浏览器网站禁止黏贴,但是要交作业怎么快速黏贴
  • Python趣学篇:用Pygame打造绚烂流星雨动画
  • 什么算得到?什么又算失去?
  • Dify在Windows 11上的安装实战
  • 《多状态DP:状态设计与状态转移方程速成指南》​
  • 【汽车电子入门】一文了解LIN总线
  • Windows+VSCode搭建小智(xiaozhi)开发环境
  • 代码随想录|动态规划|47判断子序列
  • 力扣HOT100之多维动态规划:62. 不同路径
  • 九.C++ 对引用的学习
  • 手机网站建设服务哪家好/seo长尾快速排名
  • ps做网站像素大小/柳州网站建设
  • b2b网站大全 网址大全/googlechrome
  • 公司徽标设计图片/seo网站推广工具
  • 网站因为备案关闭了 怎么办/长安网站优化公司
  • 网站建设方案怎么做/搜索引擎营销ppt