C++ cstring库函数

· · 个人记录

C++ cstring库函数

一般来说库函数都会比手写的慢。
但是这个库的函数因为是按字节比较,所以它的速度比手写的快很多,而且许多函数也非常好用。
同时因为这些函数常数巨 n i m a 小,所以可以像 bitset 一样暴力碾标算。

strlen

求一个字符串的长度,可以指定初始位置。

memset

初始化一个数组,一般来说如果初始化普通数组的化,只能初始化为0和-1,要不就用16进制表示。

strcpy

顾名思义,就是复制的意思。
最基本的应用就是复制字符数组。 但是这个函数只能指定数组的初始位置,而不能指定复制的大小。
举个栗子:

#include <bits/stdc++.h>
using namespace std;
char a[100], b[100];
int main() {
    cin >> a + 1 >> b + 1;
    cout << b + 1 << '\n';
    strcpy(a + 1, b + 1);
    cout << a + 1 << '\n';
    strcpy(a + 2, b + 2);
    cout << a + 1 << '\n';
    return 0;
}

memcpy

就是适用与所有类型数组的复制。

#include <bits/stdc++.h>
using namespace std;
int a[100], b[100];
int main() {
    for(register int i = 1; i <= 4; ++i) 
        cin >> a[i];
    for(register int i = 1; i <= 4; ++i) 
        cin >> b[i];
    for(register int i = 1; i <= 4; ++i) 
        cout << a[i] << ' ';
    cout << '\n';   
    memcpy(a, b, sizeof(b));
    for(register int i = 1; i <= 4; ++i) 
        cout << a[i] << ' ';    
    return 0;
}

优点是码量短,速度比手写的快不少,数据量小一般看不出来,但是数据量一大就出现了明显的差距。

strcmp

就是两个字符数组的比较函数,相同返回 0 , 第一个大于第二个返回一个大于 0 的数,否则返回一个小于 0 的数。

#include <bits/stdc++.h>
using namespace std;
char a[1000001], b[1000001];
int main() {
    for(register int i = 1; i <= 10; ++i)
        a[i] = '0', b[i] = '1';
    cout << strcmp(a+1, b+1) << ' ';
    return 0;
}

memcmp

就是比较普通数组的一个函数。

#include<bits/stdc++.h>
using namespace std;
int a[500100];
int main() {
    a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 1, a[5] = 2, a[6] = 3;
    cout << memcmp(a + 1, a + 4, 12);
    return 0;
}

可以手动指定长度和开始位置。

strchr

可以在一个字符数组里找某个字符第一次出现的位置。
注意它返回一个指针。

#include<bits/stdc++.h>
using namespace std;
char a[500100];
int main() {
    a[1] = 'a', a[2] = 'b', a[3] = 'a';
    char *op = strchr(a + 1, 'a');//返回指针。
    cout << op - a;
    return 0;
}

strstr

这个函数可以在一个字符数组里查找另一个字符数组第一次出现的位置。 类似与kmp模式串匹配。

#include<bits/stdc++.h>
using namespace std;
char a[500100];
int main() {
    a[1] = 'a', a[2] = 'b', a[3] = 'a', a[4] = 'b';
    char *op = strstr(a + 1, "bab");//返回指针。
    cout << op - a;
    return 0;
}

个人感觉这个函数的复杂度与KMP是差不多的。

总结

显然我没有把其它的函数放上去。
其实我感觉这些就够了,记多了容易混,其他的就手写吧。