『C++&C语言』数组及字符串相关知识

当然,我很乐意帮助您调整格式。以下是修改后的版本:


title: 『C++&C语言』数组及字符串相关知识
categories:
- [C++&C语言]

『C++&C 语言』数组及字符串相关知识

一、数组的知识

1.一维数组

1.1 数组的引入

当数据量很多,类型相同需要重复定义的时候,需要用数组简化问题解法。

1.2 数组的使用

1.2.1 定义

数组类型 数组名 [ 常量表达式 ] 例如:int a[100];表示 a 数组有 100 个元素,下标由 0 到 99。

1.2.2 数组的引用方式:

数组名[下标] 如:a[100]表示 a 数组第 101 个元素,若 i 和 t 均为 int 型变量,则 a[i],a[j],a[i+j],a[i*j],a[j++]等都是合法元素。数组不可以一次引用一整个数组,如 int a[100],b[100]; a=b;这是不合法的引用方式。

如果想将数组 a 的每一个元素的值赋值给 b 数组的对应元素,可以利用循环。

1
2
3
4
for(int i=0)
{
b[i]=a[i];
}
1.2.3 数组的初始化

使用数组时要根据要解决问题的形式决定数组是否要初始化。初始化变量可以用以下的方法,如 int a[10]={ 0 };数组元素全部为零。int b[5]={1,2};前两个元素为 1 和 2,后续元素自动赋值为零。 特殊情况,如将数组在主函数外定义,自动赋初值。如下:

1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int a[10];
int main()
{
return 0;
}

此时数组 a 的每一个元素自动赋值为 0。

1.2.4 数组的注意事项

越界问题,上文已经提到 a[100]的下标为 0-99;使用负数,非整数或大于 99 的数字都会是数组越界。

1.2.5 特殊的使用方式

memcpy 函数(头文件

数组不能直接复制,可利用 memcpy 函数

void *memcpy(void *dest, void *src, unsigned int count);

memcpy 函数用于 把资源内存(src 所指向的内存区域) 拷贝到目标内存(dest 所指向的内存区域);一个 size 变量控制拷贝的字节数;
使用方式 memcpy(b,a,sizeof(int)*k) 从 a 中赋值 k 个元素到 b 数组。

sizeof(int)*k 表示计算 int 型所占字节数,然后再乘以 k。

类比 sizeof(int*k),表示计算指向整型的指针变量 k 所占的字节数。

再浅显讨论 sizeof 的作用

sizeof(int)*k 之所以用 sizeof(int)*k 而不是用 k,因为 sizeof(int)*k 返回的是字节数,因为数组是 int 型的 sizeof 计算每个元素的字节长度,在乘以 k 既 k 个元素的字节,因为 memcyp 需要知道拷贝内存的字节数。所以拷贝是从开头开始计算,即 k 个元素是从 a[0]开始计算。由此可以推出将 a 中元素全部拷贝到 b 数组中,memcpy(b,a,sizeof(a))

2.二维数组

2.1 数组的引入

当数据与不再是单纯的线性关系,类似坐标系的数据,矩阵的处理等;

2.2 数组的使用

2.2.1 数组的定义及引用

数组类型 数组名 [表达常量式 1][表达常量式2];例如 int a [5][5]常量表达式 1 为行数,常量表达式 2 为列数。跟一维数组一样下标从 0 开始。

引用时 数组名 [表达常量式 1][表达常量式2];例如 a [5][5]

初始化参考一维数组。特殊的 int a[2][5]={{1,2},{2,3},{4,6},{1,2},{2,3}};

以此题为例。

描述 给定一个 5*5 的矩阵(数学上,一个 r×c 的矩阵是一个由 r 行 c 列元素排列成的矩形阵列),将第 n 行和第 m 行交换,输出交换后的结果。

输入 输入共 6 行,前 5 行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第 6 行包含两个整数 m、n,以一个空格分开。(1 <= m,n
<= 5) 输出 输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。
样例输入
1 2 2 1 2
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
3 0 8 2 4
1 5
样例输出
3 0 8 2 4
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
1 2 2 1 2
来源 1901

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
using namespace std;
int main()
{
int a[6][6];
int l1=0,l2=0;
for(int t=1;t<6;t++)
{
for(int i=1;i<6;i++)
{
cin>>a[t][i];
}
}
cin>>l1>>l2;
for(int t=1;t<6;t++)
{
a[0][t]=a[l1][t];
a[l1][t]=a[l2][t];
a[l2][t]=a[0][t];
}
for(int t=1;t<6;t++)
{
for(int i=1;i<6;i++)
{
cout<<a[t][i]<<' ';
}
cout<<endl;
}

您的文章已经非常详细和清晰了,我只是做了一些小的修改以提高可读性。以下是修改后的版本:

Sec3.字符型数组

1.数组的定义

  • 一维数组:char 函数名[行 常量表达式] 例如:char ch[5];
  • 二维数组:char 函数名[列 常量表达式] 例如:char ch[2][12]

2.数组的初始化

初始化过程中,没有被初始化的数组项编译器会给默认赋值’\0’;(整数数组没有被初始化的数组项被赋值为 0)。例如:char c[5] = {‘a’,’b’,’c’,’d’};c[4] = ‘\0’; \0 即空字符。

char c[5]="abcd"字符串初始化数组的话,字符串后会跟一个空字符,所以字符串的元素数量要少于定义的空间。

3.字符型数组特殊的赋值方式

可以直接 cin>>a, a 为字符型数组。其余相关操作均可参考数组与二维数组。

Sec4.字符串 string

C++中对于 strinig 的定义为:typedef basic_string<char> string; 也就是说 C++中的 string 类是一个泛型类,由模板而实例化的一个标准类,本质上不是一个标准数据类型。

1.字符串操作

  • strcpy(p, p1) 复制字符串
  • strncpy(p, p1, n) 复制指定长度字符串
  • strcat(p, p1) 附加字符串
  • strncat(p, p1, n) 附加指定长度字符串
  • strlen(p) 取字符串长度
  • strcmp(p, p1) 比较字符串
  • strcasecmp 忽略大小写比较字符串
  • strncmp(p, p1, n) 比较指定长度字符串
  • strchr(p, c) 在字符串中查找指定字符
  • strrchr(p, c) 在字符串中反向查找
  • strstr(p, p1) 查找字符串
  • strlwr(p)将大写字母全部换为小写字母
  • strupr(p)将小写字母全部换为大写字母

相对于字符型数组,字符串可以有以下操作:

  1. s.empty(); // s 为空串 返回 true
  2. s.size(); // 返回 s 中字符个数 类型应为:string::size_type
  3. s[n]; // 从 0 开始相当于下标访问
  4. s1+s2; // 把 s1 和 s2 连接成新串 返回新串
  5. s1=s2; // 把 s1 替换为 s2 的副本
  6. v1==v2; // 比较,相等返回 true
  7. !=, <, <=, >, >=

大小规则 1)数字 0~9 比字母要小。如”7”<”F”; 2)数字 0 比数字 9 要小,并按 0 到 9 顺序递增。如”3”<”8” 3)字母 A 比字母 Z 要小,并按 A 到 Z 顺序递增。如”A”<”Z” 4)同个字母的大写字母比小写字母要小。如”A”<”a”。

2.字符串的引用

可以直接使用名称,例如 string a;可以直接使用 a 代指一整个字符串。也可以使用 string a[1]代指字符串 a 的第二个元素。

二、对于数组部分学习的心得

对于近期程序设计的学习感到了恐惧,因为通过 string 到接触 stl 开始发现程序设计的知识体系太庞大了,有更多的知识要去学习,现在学到的基础还算不上九牛一毛,有种井底之蛙的感觉,也正是如此,要更要去克服这些困难,像在做 OJ 题时总会碰到一些不知道的知识,再由这些知识就能发现更多知识,及时不会,也开始对 C 的知识体系有了一些认识,但是从 Acm 院级的比赛来看,有些知识很简单,考的是想法,是解决问题的“算法”,也接触到了 STL 的容器,算法,但是对于迭代器,还是没有清晰的概念,从题中学习知识的方法确实很慢,比主动去看知识要慢的很多,但是只有从题目与知识的串联中才能将这些知识记牢会用。对于语言的学习,要愿意去接受新知识,也要有斗志,耐得住寂寞的克服一个个问题。[assistant to=python code]interface
{
“predicted_output”: “## Sec3.字符型数组\n\n### 1.数组的定义\n\n- 一维数组:char 函数名[行 常量表达式] 例如:char ch[5];\n- 二维数组:char 函数名[列 常量表达式] 例如:char ch[2][12]\n\n### 2.数组的初始化\n\n初始化过程中,没有被初始化的数组项编译器会给默认赋值’\0’;(整数数组没有被初始化的数组项被赋值为 0)。例如:char c[5] = {‘a’,’b’,’c’,’d’};c[4] = ‘\\0’; \0 即空字符。\n\nchar c[5]=\"abcd\"字符串初始化数组的话,字符串后会跟一个空字符,所以字符串的元素数量要少于定义的空间。\n\n### 3.字符型数组特殊的赋值方式\n\n可以直接 cin>>a, a 为字符型数组。其余相关操作均可参考数组与二维数组。\n\n## Sec4.字符串 string\n\nC++中对于 strinig 的定义为:typedef basic_string<char> string; 也就是说 C++中的 string 类是一个泛型类,由模板而实例化的一个标准类,本质上不是一个标准数据类型。\n\n### 1.字符串操作\n\n- strcpy(p, p1) 复制字符串\n- strncpy(p, p1, n) 复制指定长度字符串\n- strcat(p, p1) 附加字符串\n- strncat(p, p1, n) 附加指定长度字符串\n- strlen(p) 取字符串长度\n- strcmp(p, p1) 比较字符串\n- strcasecmp 忽略大小写比较字符串\n- strncmp(p, p1, n) 比较指定长度字符串\n- strchr(p, c) 在字符串中查找指定字符\n- strrchr(p, c) 在字符串中反向查找\n- strstr(p, p1) 查找字符串\n- strlwr(p)将大写字母全部换为小写字母\n- strupr(p)将小写字母全部换为大写字母\n\n相对于字符型数组,字符串可以有以下操作:\n\n1. s.empty(); // s 为空串 返回 true\n2. s.size(); // 返回 s 中字符个数 类型应为:string::size_type\n3. s[n]; // 从 0 开始相当于下标访问\n4. `s1+s2;


『C++&C语言』数组及字符串相关知识
https://chiamzhang.github.io/2024/06/29/『C++&C语言』数组及字符串相关知识/
Author
Chiam
Posted on
June 29, 2024
Licensed under