说明:包涵C语言常用字符串处理函数
1.memchr
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: void *memchr(const void *str, int c, size_t n)
* @description: C 库函数 void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
* @param {*}
* @return {*} 该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。
*/
int main()
{
char str[100] = {0};
cin.getline(str, 100);
char c = '.';
char* rst = (char*)memchr(str, c, 10);
if (rst == nullptr) {
return 0;
}
cout<<"after " << c <<" display: "<< rst << endl;
getchar();
return 0;
}
// str:www.baidu.com rst:.baidu.com
2.memcmp
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: int memcmp(const void *str1, const void *str2, size_t n)
* @description: C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
* @param {*}
* @return 如果返回值 < 0,则表示 str1 小于 str2。
* @return 如果返回值 > 0,则表示 str1 大于 str2。
* @return 如果返回值 = 0,则表示 str1 等于 str2。
*/
int main()
{
char str1[100] = {0};
char str2[100] = {0};
cin.getline(str1, 100);
cin.getline(str2, 100);
int rst = memcmp(str1, str2, sizeof(str1));
cout << rst << endl;
getchar();
return 0;
}
// str1: 123 str2: 122 rst:1
// str1: 122 str2: 123 rst:-1
// str1: 122 str2: 122 rst: 0
3.memcpy
/**
* @original: void *memcpy(const void *str1, const void *str2, size_t n)
* @description:C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
* @param {*}
* @return 该函数返回一个指向目标存储区 str1 的指针。
*/
int main()
{
char str1[100] = {0};
char str2[100] = {0};
cin.getline(str1, 100);
cin.getline(str2, 100);
int size = strlen(str2);
char* rst = (char*)memcpy(str1, str2, size);
if (rst == nullptr) {
return 0;
}
cout << rst << endl;
cout << str1 << endl;
getchar();
return 0;
}
// input : str1: 123456789 str2: qwer
// output: rst:qwer56789 str1:qwer56789
4.memmove
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: void *memmove(void *str1, const void *str2, size_t n)
* @description:C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
* @param {*}
* @return 该函数返回一个指向目标存储区 str1 的指针。
*/
int main()
{
char str1[100] = {0};
char str2[100] = {0};
cin.getline(str1, 100);
cin.getline(str2, 100);
int size = strlen(str2);
cout << size << endl;
char* rst = (char*)memmove(str1, str2, size);
if (rst == nullptr) {
return 0;
}
cout << rst << endl;
cout << str1 << endl;
getchar();
return 0;
}
// input : str1: 123456789 str2: qwer
// output: rst:qwer56789 str1:qwer56789
5.memset
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: void *memset(void *str1, int c, size_t n)
* @description:C 库函数 void *memset(void *str1, int c, size_t n) 将str1的前n个字符替换为c对应得ascill值
* @param {*}
* @return 该函数返回一个指向目标存储区 str1 的指针。
*/
int main()
{
char str1[100] = {0};
cin.getline(str1, 100);
char c = getchar();
int n = 0;
cin >> n;
char *rst = static_cast<char*>(memset(str1, c, n));
cout << rst << endl;
cout << str1 << endl;
getchar();
getchar();
return 0;
}
// input: str1: 123456789 c:a n:3
// output: rst:aaa456789 str1:aaa456789
6.strcat和strncat
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: char *strcat(char *str1, const char* str2)
* @description:C 库函数 char *strcat(char *str1, const char* str2) 将str2追加到str1后面
* @description:C 库函数 char *strcat(char *str1, const char* str2, size_t n) 将str2的前n个字节追加到str1后面
* @param {*}
* @return 该函数返回一个指向目标存储区 str1 的指针。
*/
int main()
{
char str1[100] = {0};
char str2[100] = {0};
cin.getline(str1, 100);
cin.getline(str2, 100);
char *rst = strcat(str1, str2);
cout << rst << endl;
cout << str1 << endl;
rst = strncat(str1, str2, 2);
cout << rst << endl;
cout << str1 << endl;
getchar();
return 0;
}
// input:str1: 123456789 str2:qwer
// output: rst:123456789qwer str1:123456789qwer
// output: rst:123456789qwerqw str1:123456789qwerqw
7.strchr和strrchr
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: char *strchr(const char *str, int c)
* @original: char *strrchr(const char *str, int c)
* @description:C 库函数 char *strchr(const char *str, int c) 返回str中第一次出现c的指针
* @description:C 库函数 char *strrchr(const char *str, int c) 返回str中最后一次出现c的指针
* @param {*}
* @return 该函数返回一个指向目标存储区 str 的指针。
*/
int main()
{
char str1[100] = {0};
cin.getline(str1, 100);
char c = getchar();
char *rst1 = strchr(str1, c);
char *rst2 = strrchr(str1, c);
cout << rst1 << endl;
cout << rst2 << endl;
getchar();
getchar();
return 0;
}
// input : str1: 12345678912 c:1
// output: rst1: 123456789 rst2:12
8.strcmp和strncmp
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: int strcmp(const char *str1, const char* str2)
* @description:C 库函数 int strcmp(const char *str, const char* str2) 比较str1和str2的大小
* @description:C 库函数 int strncmp(const char *str, const char* str2, size_t n) 比较str1和str2前n个字符的大小
* @param {*}
* @return > 返回1
* @return < 返回-1
* @return = 返回0
*/
int main()
{
string str1;
string str2;
getline(cin, str1);
getline(cin, str2);
int rst = strcmp(str1.c_str(), str2.c_str());
cout << rst << endl;
rst = strncmp(str1.c_str(), str2.c_str(), 3);
cout << rst << endl;
getchar();
return 0;
}
// input:str1: 123456789 str2:123456666
// output: rst: 1
// output: rst: 0
9.strcpy和strncpy
#include <iostream>
#include <string.h>
using namespace std;
/**
* @original: void *strncpy(const void *str1, const void *str2, size_t n)
* @original: void *strcpy(const void *str1, const void *str2)
* @description:C 库函数 void *strncpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
* @param {*}
* @return 该函数返回一个指向目标存储区 str1 的指针。
*/
int main()
{
char str1[100] = {0};
char str2[100] = {0};
cin.getline(str1, 100);
cin.getline(str2, 100);
int size = strlen(str2);
char* rst = (char*)strncpy(str1, str2, size);
if (rst == nullptr) {
return 0;
}
cout << rst << endl;
cout << str1 << endl;
getchar();
return 0;
}
// input : str1: 123456789 str2: qwer
// output: rst:qwer56789 str1:qwer56789
10.strspn和strcspn
#include <iostream>
#include <string.h>
using namespace std;
/**
* @original: void *strcspn(const void *str1, const void *str2)
* @description: strcspn() 从字符串 str 的开头计算连续的字符,而这些字符都完全不在字符串 accept 中。
* 简单地说,若 strcspn() 返回的数值为 n,则代表字符串 str 开头连续有 n 个字符都不含字符串 accept 中的字符。
* @original: void *strspn(const void *str1, const void *str2)
* @description:strspn() 从参数 str 字符串的开头计算连续的字符,而这些字符都完全是 accept 所指字符串中的字符。
* 简单的说,若 strspn() 返回的数值为n,则代表字符串 str 开头连续有 n 个字符都是属于字符串 accept 内的字符。
* @param {*}
* @return 该函数返回一个指向目标存储区 str1 的指针。
*/
int main()
{
char str1[100] = {0};
char str2[100] = {0};
cin.getline(str1, 100);
cin.getline(str2, 100);
int rst1 = strcspn(str1, str2);
int rst2 = strspn(str1, str2);
cout << rst1<< endl;
cout << rst2 << endl;
getchar();
return 0;
}
// input : str1: 123456789 str2: 123qwer4
// output: rst1: 0 rst2:4
// input : str1: 12345q6789 str2: qwer4567
// output: rst1: 3 rst2:0
11.strlen和sizeof
#include <iostream>
#include <string.h>
using namespace std;
/**
* @original: size_t strlen(const char* str);
* @description: 获取字符串长度,不包含结束字符
* @description: sizof()获取字符串长度,包含结束字符
* @param {*}
* @return 字符串长度
*/
int main()
{
char str1[100] = {0};
cin.getline(str1, 100);
int rst1 = strlen(str1);
int rst2 = sizeof(str1);
cout << rst1<< endl;
cout << rst2 << endl;
getchar();
return 0;
}
// input : str1: 123456789
// output: rst1: 9 rst2:100
12.strerror
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/**
* @original: char* strerror(int errnum)
* @description: 返回内部错误信息
* @param {*}
* @return 内部错误信息。
*/
int main()
{
FILE *fp = fopen("1.txt", "r");
if (fp == nullptr) {
cout << strerror(errno) << endl;
}
getchar();
return 0;
}
// output: No such file or directory
13 strstr
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/**
* @original: char* strstr(const char* str1, const char* str2)
* @description: 返回str2在str1中第一次出现的位置
*/
int main()
{
char* str1 = (char*)malloc(100);
char* str2 = (char*)malloc(100);
cin.getline(str1, 100);
cin.getline(str2, 100);
if (str1 == nullptr || str2 == nullptr) {
return 0;
}
char* rst = strstr(str1, str2);
cout << rst << endl;
getchar();
free(str1);
free(str2);
return 0;
}
// input: str1: 123456789 str2:56
// output: 56789
14.strpbrk
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/**
* @original: char* strpbrk(const char* str1, const char* str2)
* @description: 依次遍历str1中的字符,返回str1中字符第一次出现在str2中的位置
*/
int main()
{
char* str1 = (char*)malloc(100);
char* str2 = (char*)malloc(100);
cin.getline(str1, 100);
cin.getline(str2, 100);
if (str1 == nullptr || str2 == nullptr) {
return 0;
}
char* rst = strpbrk(str1, str2);
cout << "rst:" << rst << endl;
getchar();
free(str1);
free(str2);
return 0;
}
// input: str1: 123456789 str2:qwerty75
// output: rst:56789
// input: str1: 123456789 str2:qwerty
// output: rst:
15.strtok
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/**
* @original: char *strtok(char *str, const char* delim)
* @description:C 库函数 char *strtok(char *str, const char* delim)
* @param {*}
* @return 该函数返回第一个被分解的字符串。
*/
int main()
{
char str1[100] = {0};
cin.getline(str1, 100);
char delim[100] = {0};
cin.getline(delim, 100);
char* subStr = strtok(str1, delim);
while (subStr != nullptr) {
cout << subStr << endl;
subStr = strtok(nullptr, delim);
}
getchar();
return 0;
}
// input : str1: www.baidu.com delim:.
// output: www
// baidu
// com