从零开始学C++之数组和字符串

数组
字符串
所有题目来自ACWing


👇从零开始学C++系列👇

从零开始学C++之基本知识
从零开始学C++之数组和字符串
从零开始学C++之函数、结构体、类、指针、引用
从零开始学C++之STL容器、位运算与常用库函数


数组

知识点

  全局变量的定义,默认值为0存在堆空间,无长度限制,堆里虚拟分配,使用再开内存,没开的时候标记全部指向0,零页

  局部变量,默认值是随机的,存在栈空间,在栈空间中的变量会占内存

定义数组

    int a[100], b[10];
    float c[20];
    double d[10];
    char e[14];
    string g[25]; // 字符串数组 单个元素是一个字符串
    //相当于二维数组


cstring头文件中的一些函数

  • memset()初始化: -> 比循环赋值效率高
  • 赋值是按字节赋值,因此只有赋予-10时才与预期一致。其最后一个参数的单位是Byte
    格式 memset(数组名, 将每个字节初始化成什么值, 初始多长(单位是Byte))
    例如:memset(a, 0, sizeof a); 将数组a赋为全0
  • memcpy()复制:
  • 格式:memcpy(目标数组名, 源数组名, 源数组Byte长度)
    memcpy(b, a, sizeof a);

sizeof 可不加括号,即可这样使用sizeof a,其返回单位是Byte


题目

753. 平方矩阵 I
754. 平方矩阵 II
756. 蛇形矩阵



字符串

ASCII码

背下来

  • 48 ~ 57 : 0 ~ 9
  • 65 ~ 90 : A ~ Z
  • 97 ~ 127 : a ~ z

字符数组

字符串是字符数组加上结束符"\0",字符数组长度至少比字符串多1

//环境 VSCode
    char a1[] = {'B', '+', '+', '\0'};
    char a2[] = "C++";
    char a3[] = {'A', '+', '+'};
    char a4[] = {'C', '\0'};
    cout << sizeof a2 << endl; // 4
    cout << sizeof a3 << endl; // 3
    printf("%s\n", a2);//输出是C++
    printf("%s\n", a3); //输出是A++C++

字符串输入输出

  • 输入
    C语言
char s[N];
scanf("%s", s);          // 不能读取含空格、换行符的字符串
gets(s);                // 能读取含空格的字符串,同时自动去掉换行符\n
fgets(s, N, stdin);      // 能读取含空格的字符串,但不会去掉换行符\n。【注意】

  C++

#include <string>
string str;
cin >> str;             // 能读取含空格、不能读换行符的字符串
getline(cin, str);       // 能读取含空格的字符串,同时自动去掉换行符\n
  • 输出
puts(s);
printf("%s\n", s);
cout << s << endl;

字符串操作

<string>

#include <string>

// 初始化
string s1; // 默认空字符串
string s2 = s1; // s2是s1的一个副本
string s2 = "hiya"; // s3是该字符串字面值的一个副本
string s4(10, 'c'); // s4的内容是cccccccccc

//读入/输出
//不能用scanf读入,但可以用printf输出
cin >> s1;
getline(cin, s1);
printf("%s", s1.c_str()); // 返回存储s1的字符数组的首地址,用printf输出
puts(s1);

s1.empty(); // 判断是否为空字符串
s1.size(); // 长度,与stelen()不同的是,这个复杂度是O(1),不用额外的变量保存
s1.pop_back(); // 删掉最后一个字符
s1.substr(begin, length);   //位置指定的子串

// 按字典序比较 ">"、"<"
// 加法拼接时,要保证加号两边至少有一个string变量

for (char ch : str) {...}   // 遍历(不可修改字符)
for (char &ch : str) {...}  // 遍历(可修改字符)

auto s; // 可以自动判别类型

遍历字符串

双指针算法
从前向后遍历整个字符串

for(i=0;i<len;i++)
{
	//用j把和s[i]相等的这一整段全部找到
	int j = i;
	while(j<len&&s[j]==s[i]) 
		j++;
	//j是不等于i的第一个字符
	i = j-1;
}

字符串流

<sstream>

#include <sstream>

string s;
stringstream ssin(s);
while(ssin >> s) {...}      // 按空格拆分成 字符串s,例如英语句子拆分单词

// 可用如下代码代替
while(cin >> word) {
    ...
}


题目

763. 循环相克令
772. 只出现一次的字符
770. 单词替换
771. 字符串中最长的连续出现的字符
777. 字符串乘方
779. 最长公共字符串后缀

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tancy.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值