字符数组与模拟法
课上练习
知识总结
字符数组知识总结
字符数组-知识总结 概念 字符数组即是字符类型的数组,即char类型的数组,其特别之处在于可以与字符串进行混合运算: 可以使用字符串对其进行初始化 可以直接将字符串读入到整个字符数组内 可以直接输出整个字符数组内的内容 可以使用内置函数对字符数组继续操作
初始化方式 直接使用大括号对字符数组初始化,主要要留下'\0'的位置
char chArr[5] = {};
char chArr[5] = {‘h’, ‘e’};
char chArr[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};
char chArr[6] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};使用字符串对字符数组进行初始化
char chArr[5] = “”;
char chArr[5] = “he”;
char chArr[5] = “hello”; //错误
char chArr[6] = “hello”;
char chArr[] = “hello”;字符数组的使用 直接将字符串读入到字符数组内
char chs[100];
cin >> chs;直接输出整个字符数组内的内容
char chs[100] = "hello";
cout << chs;获取下标为i的位置的字符
char chs[100] = "hallo";
chs[1] = 'e';
for (int i = 0; i < 5; ++i) {
cout << chs[i];
}字符数组内置函数 strlen strlen函数可获取字符串长度,需要填写一个参数,即要获取长度的字符串,该函数返回一个整数表示字符串的长度。
char chs[100] = {'h', 'e'};
int length = strlen(chs);strcpy strcpy函数可将一个字符串复制到另外一个字符串内,需要填写两个参数,第一个参数是被赋值的字符串,第二个参数是被复制的字符串,该函数没有返回值。 注意:被赋值的字符串一定要有足够的空间来进行存储,大小一定要大于第二个被复制的串的长度。
char chs[100] = {'h', 'e'};
char chs1[100] = "hello";
strcpy(chs, "123"); // chs:123
strcpy(chs, chs1); //chs: hellostyncpy strncpy函数可将一个字符串的指定数量的字符复制到另外一个字符串内,需要填写三个参数,第一个参数是被赋值的字符串,第二个参数是被复制的字符串,第三个参数是要复制的字符数,该函数没有返回值。 注意:使用strncpy函数后最好手动为被赋值的字符串末尾添加'\0'字符,以确保其是一个有效的字符串。
1char chs[100] = {'h', 'e'};
2char chs1[100] = "hello";
3strncpy(chs, "123",1); // chs:1
4chs[1] = '\0';
5strcpy(chs, chs1,3); //chs: hel
6chs[3] = '\0';strcat strcat函数可将一个字符串接到另外一个字符串后面,需要填写两个参数,第一个是被连接的字符串,第二个是要连接的字符串,该函数没有返回值。 注意:被赋值的字符串一定要有足够的空间来进行存储,要保证连接后的字符串大小不会超过整个字符数组的大小。
char chs[100] = {'h', 'e'};
char chs1[100] = "hello";
strcat(chs, "123"); // chs:he123
strcat(chs, chs1); //chs: hehellostrcmp strcmp参数可以比较两个字符串的字典序大小,需要填写两个参数,表示两个要被比较的字符串,该函数有一个返回值: 若第一个字符串的字典序小于第二个字符串的字典序,则返回-1; 若两个字符串完全相同,则返回0; 若第一个字符串的字典序大于第二个字符串的字典序,则返回-1。
strcmp("12", "123"); // 返回 -1
strcmp("234", "12"); // 返回 1
strcmp("234", "34"); // 返回 1
strcmp("123", "123"); // 返回 0
strcmp("Zebra", "apple"); // 返回 -1字典序 逐个比较一对字符串相同位置上的字符,字符ASCII码小的串更小,若所有字符都相同,那么短的字符串更小。
️课后作业
☝️单选作业
错误的题目要弄懂,不会的千万要来问老师⚠️
✌️总结作业
总结作业非常重要,请务必认真完成✔️
- 字符数组的特殊初始化方式是什么?
- 字符数组的结尾是哪个特殊字符?
- 如何获取字符数组内存储的字符数?
- 如何复制一个字符串到一个字符数组内?
- 如何给一个字符数组追加一段字符串?
- 如何比较两个字符数组的大小?
- 模拟法的核心思想是什么?
👌编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
👌编程作业标准答案
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
字符数组与模拟法-选择题
字符数组与模拟法-选择题 如果字符串定义为 char str[] = "Hello";,则字符数组 str 的大小为( )。 A. 0 B. 5 C. 6 D. 7
定义字符数组 char str[20] = {'G', 'E', 'S', 'P'}; ,则 str 的字符串长度为( )。 A. 4 B. 5 C. 19 D. 20
如何初始化一个字符数组并保证它为空字符串?
A. char array[10] = "";
B. char array[10] = ' ';
C. char array[10] = 0;
D. char array[10] = '\0';字符数组的结尾是哪个特殊字符? A. \n B. \0 C. \r D. \t
如何获取字符数组内存储的字符数? A. 使用 strlen 函数 B. 使用 sizeof 运算符 C. 使用 strcpy 函数 D. 使用 strcat 函数
如何复制一个字符串到一个字符数组内? A. 使用 strcpy 函数 B. 使用 strcmp 函数 C. 使用 strlen 函数 D. 使用 strcat 函数
如何给一个字符数组追加一段字符串? A. 使用 strcpy 函数 B. 使用 strcmp 函数 C. 使用 strlen 函数 D. 使用 strcat 函数
如何比较两个字符数组的大小? A. 使用 strcpy 函数 B. 使用 strcmp 函数 C. 使用 strlen 函数 D. 使用 strcat 函数
如何确保字符数组的内容不会溢出? A. 使用 strcat 函数 B. 确保数组足够大,并使用 strncpy 函数 C. 使用 strcpy 函数 D. 使用 strcmp 函数
如果希望记录最长为99字节的字符串,可以将字符串数组定义为 char s[100]; A. 正确 B. 错误
字符数组与模拟法-选择题答案
字符数组与模拟法-选择题答案 C 解析:char str[] = "Hello"; "Hello"会包含一个‘\0'字符作为字符串的结尾,所以 str 数组的大小为6,但是str数组内存储的字符串的长度为5。 A 解析:char str[20] = {'G', 'E', 'S', 'P'}; 会初始化前4个元素,因此str数组内存储的字符串长度为4。 A 解析:这个初始化确保数组的第一个元素是字符串终止符 \0,从而使数组成为一个空字符串。 B 解析:字符数组的结尾是由特殊字符 \0 标记的,这个字符被称为空字符(null character)或者字符串终止符(string terminator)。 A 解析:strlen 函数计算以 \0 结尾的字符数组(即 C 风格字符串)的长度,不包括终止的空字符。 A 解析:strcpy 函数用于将源字符串复制到目标字符数组中,包括复制结尾的空字符 \0。 D 解析:strcat 函数用于将一个字符串追加到另一个字符串的末尾。它要求目标数组有足够的空间来容纳追加的字符串以及原有的字符串和结尾的空字符 \0。 B 解析:strcmp 比较两个字符串的内容,并返回一个整数来指示它们在字典序上的关系。 B 解析:这样的做法既考虑了数组的空间分配,又利用了 strncpy 的长度限制功能来降低溢出的风险。 A 解析:将字符串数组定义为 char s[100]; 以记录最长为99字节的字符串是正确的。这样做确保了字符串总是有空间来存储其结束标志,从而避免了未定义行为,如字符串未正确终止导致的溢出或其他问题。
L2064题解+参考代码
L2064题解+参考代码 题目链接 判断是否构成回文:L2064
题解 题目要求我们判断输入的一串字符是否构成回文字符串。回文字符串是指从左到右和从右到左读都是一样的字符串。我们可以使用双指针方法来检查字符串是否是回文。
算法步骤 读取输入:读取一串字符,字符个数不超过 100。 检查回文:使用 for 循环从字符串的两端向中间移动,依次比较字符: 如果相应位置的字符相等,则继续比较。 如果相应位置的字符不相等,则字符串不是回文。 输出结果:根据检查结果输出 "TRUE" 或 "FALSE"。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 char str[101];
7 cin >> str;
8
9 int len = strlen(str);
10 bool isPalindrome = true;
11
12 // 检查回文
13 for (int i = 0; i < len / 2; ++i) {
14 if (str[i] != str[len - 1 - i]) {
15 isPalindrome = false;
16 break;
17 }
18 }
19
20 // 输出结果
21 if (isPalindrome) {
22 cout << "TRUE" << endl;
23 } else {
24 cout << "FALSE" << endl;
25 }
26
27 return 0;
28}L2065题解+参考代码
L2065题解+参考代码 题目链接 字符串出现次数:L2065
题解 题目要求我们计算子串 s1 在字符串 s2 中出现的次数。可以通过手动实现字符串匹配算法来完成这一任务。 算法步骤 读取输入:读取子串 s1 和字符串 s2。 计算字符串长度:分别计算子串 s1 和字符串 s2 的长度。 初始化计数器:初始化一个计数器,用于记录 s1 在 s2 中出现的次数。 遍历字符串 s2: 使用一个循环从 0 到 len2 - len1,其中 len1 是 s1 的长度,len2 是 s2 的长度。 比较子串: 对于每个位置,使用一个内部循环比较 s2 的子串和 s1。 如果当前字符不匹配,则停止比较,并继续到下一个位置。 如果所有字符都匹配,则计数器增加 1。 输出结果:输出计数器的值。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 char s1[100], s2[100];
7 cin >> s1 >> s2;
8
9 // 计算字符串长度
10 int len1 = strlen(s1);
11 int len2 = strlen(s2);
12
13 // 初始化计数器
14 int count = 0;
15
16 // 遍历字符串 s2
17 for (int i = 0; i <= len2 - len1; ++i) {
18 bool match = true;
19 // 比较子串
20 for (int j = 0; j < len1; ++j) {
21 if (s2[i + j] != s1[j]) {
22 match = false;
23 break;
24 }
25 }
26 // 如果匹配则计数器加1
27 if (match) {
28 count++;
29 }
30 }
31
32 // 输出结果
33 cout << count << endl;
34
35 return 0;
36}