C語言實現字串的複製,比較,模式匹配,替換等各種操作。
阿新 • • 發佈:2019-01-29
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<n) {
*tmp++ = *src++;
++i;
}
*tmp = '\0';
return ret;
}
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<stdio.h>
#include<string>
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;
}