c语言中没有字符串,想要用字符串只能用字符指针来实现了。这些函数都是自己学习C后复现的,和C的模板库中的会有差别。字符串的常见操作有:
strcpy(p, p1)将字符串p1复制到p的开头
char* strcpy(char* dest, const char* src) {
if (dest == NULL || src == NULL) {
return NULL;
}
char* ret=dest;
while (*dest != '\0'&& *src != '\0') {
*dest++ = *src++;
}
return ret;
}
strncpy(p, p1, n) 复制指定长度字符串p不能比p1短
char* strncpy(char* dest, char* src, int n) {
if (dest == NULL || src == NULL) {
return NULL;
}
char* ret = dest;
int i = 0;
while (*src!= '\0'&& i < n) {
*dest++ = *src++;
++i;
}
return ret;
}
strlen(p) 取字符串长度,不包括结束符‘\0’
int strlen(char* dest) {
if (dest == NULL) return 0;
int length = 0;
while (*(dest++) != '\0')
++length;
return length;
}
strcat(p, p1) 附加字符串将p1加到p的尾部
char* strcat(char* dest, char* src) {
if (dest == NULL || src == NULL) return NULL;
int srclen = strlen(src);
int destlen = strlen(dest);
char* ret = (char*)malloc((destlen + srclen + 1) * sizeof(char));
char* tmp = ret;
while (*dest != '\0') {
*ret++= *dest++;
}
while (*src != '\0') {
*ret++ = *src++;
}
*ret = '\0';
return tmp;
}
strncat(p, p1, n) 附加指定长度字符串,将p1的前n个字符复制到p的尾部
char* strncat(char* dest, char* src, int n) {
if (dest == NULL || src == NULL || n <= 0) {
return NULL;
}
char* tmp = (char*)malloc((strlen(dest) + n + 1) * sizeof(char));
char* ret = tmp;
while (*dest != '\0') {
*tmp++ = *dest++;
}
int i = 0;
while (*src != '\0' && i
strcmp(p, p1) 比较字符串
int strcmp(char* dest, char* src) {
if (dest == NULL && src == NULL) return 0;
int i = 0;
while ((*dest != '\0') && (*src != '\0')) {
if (*dest > *src) return 1;
else if (*dest < *src) return -1;
else {
++dest;
++src;
}
}
if (*dest == '\0' && *src=='\0') return 0;
else if (*dest == '\0') return -1;
else return 1;
}
strcasecmp(p,p1)忽略大小写比较字符串
//辅助函数,将大字母转换成小写
char tolower(const char c) {
return (('A' <= c) && (c <= 'Z')) ? (c - 'A' + 'a') : c;
}
int strcasecmp(char* dest, char *src) {
char* p1 = dest;
char* p2 = src;
int result = 0;
if (p1 == p2) {
return 0;
}
while ((result =tolower(*p1) - tolower(*p2)) == 0) {
if (*(++p1) == '\0') break;
++p2;
}
return result;
}
strncmp(p, p1, n) 比较指定长度字符串
int strncmp(const char* dest, const char* src, int n) {
const unsigned char* p1 = (const unsigned char*)dest;
const unsigned char* p2 = (const unsigned char*)src;
if (p1 == p2) return 0;
int result=0,i=0;
while ((i < n) && ((result = *p1 - *p2) == 0)) {
if (*(++p1) == '\0') break;
++p2;
++i;
}
return result;
}
strchr(p, c) 在字符串中查找指定字符
int strchr1(const char* dest, const char c) {
const unsigned char* p = (const unsigned char*)dest;
int i = 1;
while (*p != '\0') {
if (*p++ == c) return i;
++i;
}
return 0;
}
strstr(p, p1) 查找字符串,返回匹配的位置
int strstr1(const char* dest, const char* src) {
const unsigned char* p = (const unsigned char*)dest;
int i = 1;
while (*p != '\0') {
const unsigned char* tmp = p;
const unsigned char* p1 = (const unsigned char*)src;
while (*tmp== *p1) {
if (*(++p1)== '\0') break;
++tmp;
}
if (*p1 == '\0') return i;
++p;
++i;
}
return 0;
}
strreplace(p,p1,p2,p3)字符串替换,将p中的p2全部替换成p3
//先查找,返回匹配处的指针
char* strstr2(const char* dest, const char* src) {
const unsigned char* p = (const unsigned char*)dest;
while (*p != '\0') {
const unsigned char* tmp = p;
const unsigned char* p1 = (const unsigned char*)src;
while (*tmp == *p1) {
if (*(++p1) == '\0') break;
++tmp;
}
if (*p1 == '\0') return (char*)p;
++p;
}
return NULL;
}
char* strreplace(const char* dest, const char* src, const char* rep) {
char* p = (char*)dest;
char* tmp = strstr2(dest, src);
while (tmp != NULL) {
char* secstr = tmp + strlen(src); //后部分的地址
*tmp = '\0'; //截断,获取前部分
p=strcat((char*)p, (char*)rep); //将要替换的连接到前的尾部
//printf("%s\n", p);
p = strcat(p, secstr); //再将后部分连接起来,构成新的串
tmp = strstr2(p, src); //再次查找
}
return p;
}
函数验证
#include "stdafx.h"
#include
#include
using namespace std;
//各种函数
int main()
{
//string
char dest[] = "abcdefbcdncsanibcd";
char src[] = "bcd";
char rep[] = "BCD";
char d = 'c';
//strcpy_s(dest, src);库函数
/*strncpy(dest, src, 15);*/
//printf("%d", strstr1(dest,src));
printf("%s", strreplace(dest,src,rep));
printf("\n");
return 0;
}