数组
计算数组个数
int length = sizeof 数组名 / sizeof(类型)
字符串
c-风格字符串特殊的性质:以空字符( \0 )结尾.
c++中处理字符的函数,例如cout都是逐个处理字符串中的字符,直到空字符.
将字符串初始化为数组的方法: 双引号 " ". 数组长度需要考虑包含空字符.
sizeof 数组名 / sizeof(类型) = strlen() + 1;
单双引号的不同
char shirt_size = 's'; //字符常量
char shirt_size[2] = "S"; //包含 S 和 \0
用符号常量来定义数组长度,
cin使用空白(空格,制表符,换行符)(Space、Tab、Enter)来确定字符串的结束位置. 因此cin在读取字符数组时只读取一个单词,并自动在结尾添加空字符. 因此下述
c++之cin/cin.get/cin.getline()详解 - CTHON - 博客园 (cnblogs.com)
当使用不同的输入函数来读取字符串数组时,会有不同的影响:
cin:
char str[100]; cin >> str;
cin
使用空格作为分隔符,只会读取一个单词(以空格为界限)。- 如果用户输入的字符串包含空格,则只会读取空格前的部分。
- 如果用户输入的字符串长度超过数组大小,会导致溢出问题。
cin.get():相较于getline()检查错误更容易一些<1>
cin.get()
用于从输入流中读取一个字符,包括空格和换行符。<2>cin.get(name ,size),name必须是char[] ,不能是string。但此种调用会将换行符留在输出队列中,因此在第二次调用cin.get()之前要先使用cin.get()来跨过换行符。
<1> char ch; cout << "Enter a character: "; ch = cin.get(); cout << "Character: " << ch << endl; <2> cin.get(name, azsize); cin.get(); //读取换行符 cin.get(dessert,azsize);
cin.getline():
cin.getline()
读取整行字符,包括空格,但不会保留换行符在输入缓冲区中。- 读取的字符串不会包含换行符。
- 如果用户输入的字符串长度超过数组大小,会导致溢出问题。
char str[100]; cin.getline(str, sizeof(str));
string类
#include <string.h>
string也可作为数组使用。
string简化了字符串合并的操作。并且可以使用运算符+将两个string对象合并起来,还可使用+=
C风格字符串相关函数
strcpy(charr1,charr2); //copy charr2 to charr1
strcat (charr1,charr2); //将字符串charr2+到charr1末尾
其他的一些函数:
strcpy(dest, src): //将字符串 src 复制到字符串 dest 中,包括null终止符。 strncpy(dest, src, n): //将最多 n 个字符从字符串 src 复制到字符串 dest 中。不会自动添加null终止符。 strlen(str): //字符串 str 的长度,不包括null终止符。 strcmp(str1, str2): //比较字符串 str1 和 str2,返回一个整数表示比较结果。0 表示相等,负数表示 //str1 小于 str2,正数表示 str1 大于 str2。 strcat(dest, src): //将字符串 src 追加到字符串 dest 的末尾,并添加null终止符。 strncat(dest, src, n): //将最多 n 个字符从字符串 src 追加到字符串 dest 的末尾,并添加null终止符。 strstr(str, substr):// 在字符串 str 中查找子字符串 substr,返回一个指向第一次出现的位置的指针,如果没有找到返回 NULL。 strchr(str, c): //在字符串 str 中查找字符 c,返回一个指向第一次出现的位置的指针,如果没有找到返回 NULL。 strrchr(str, c):// 在字符串 str 中查找字符 c,返回一个指向最后一次出现的位置的指针,如果没有找到返回 NULL。 strncmp(str1, str2, n): //比较最多前 n 个字符的字符串 str1 和 str2,返回一个整数表示比较结果,用法类似于 strcmp。
str3 = str1 + str2; ====相等 strcpy(charr3,charr1); strcat(charr3,charr2);
结构体
可以储存不同的数据类型,可以用等号=在相同的结构变量赋值,可以组成结构体数组。
结构体指针:
定义结构体指针: 定义一个结构体指针变量,可以通过在结构体类型名称前加上指针符号
*
来实现。例如:struct Person { char name[50]; int age; }; struct Person person1; struct Person* ptrPerson; // 定义结构体指针变量 ptrPerson = &person1; // 将指针指向结构体变量
通过指针访问结构体成员: 使用箭头运算符
->
可以通过结构体指针访问结构体的成员。ptrPerson->age = 30; // 访问结构体指针的成员
动态分配内存并使用指针: 使用
new
运算符(在C++中)或malloc
函数(在C中)可以动态分配内存以存储结构体,并将返回的指针指向分配的内存。struct Person* ptrPerson = new Person; // C++ // 或 struct Person* ptrPerson = (struct Person*)malloc(sizeof(struct Person)); // C ptrPerson->age = 25; // 设置结构体成员的值 // 记得释放内存 delete ptrPerson; // C++ // 或 free(ptrPerson); // C
传递结构体指针给函数: 通过将结构体指针作为参数传递给函数,可以在函数内部对结构体进行修改。
struct Person person; struct Person* ptrPerson = &person; modifyPerson(ptrPerson); void modifyPerson(struct Person* p) { p->age += 10; }
指向结构体数组的指针: 你可以使用指向结构体数组的指针来访问数组中的不同结构体元素。
struct Point { int x; int y; }; struct Point points[5]; // 定义结构体数组 struct Point* ptrPoints = points; // 指向结构体数组的指针 ptrPoints[0].x = 10; // 访问第一个结构体元素的成员 *(ptrPoints).x = 10;
枚举
enum创建了另一种创建符号常量的方式,可代替const 和 define。
第一个值默认为0,后面没有被初始化的枚举量的值将比前面初始化的枚举量大1。