序言.字符串的创建
char s[5] = {'a', 'b', 'c', 'd', '\0'};
char s[5] = "abcd";
char *s = "abcd";
char *s = (char *)malloc(5);
if (s == NULL) {
printf("内存分配失败\n");
exit(1);
}
strcpy(s, "abcd");
string *s = (string *)malloc(sizeof(string));
if (s == NULL) {
printf("内存分配失败\n");
exit(1);
}
s->data = (char *)malloc(5);
if (s->data == NULL) {
printf("内存分配失败\n");
exit(1);
}
strcpy(s->data, "abcd");
s->length = 4;
c语言字符串常见函数
strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
strlen(s1);
返回字符串 s1 的长度。
strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
1.顺序存储
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 255
typedef struct{
char ch[MAXSIZE+1];
int length;
}sstring;
void StrAssign(sstring *s1,char* s2){
int i=0;
while(s2[i]!='\0'){
s1->ch[i] =s2[i];
i++;
}
s1->length =i;
}
void StrCopy(sstring *s1,sstring* s2){
for(int i=0;i<=s2->length;i++){
s1->ch[i] =s2->ch[i];
}
s1->length = s2->length;
}
int StrEmpty(sstring s){
return s.length==0;
}
int StrLength(sstring s){
return s.length;
}
void ClearString(sstring * s){
s->length=0;
s->ch[0]='\0';
}
void DestroyString(sstring *s){
s->length =0;
free(s);
}
void ConCat1(sstring *s1,sstring s2){
int i=0;
while(i<s2.length){
s1->ch[s1->length+i]=s2.ch[i];
i++;
}
s1->length+=s2.length;
s1->ch[s1->length]='\0';
}
void ConCat2(sstring*s3,sstring s1,sstring s2){
int i=0;
for(i=0;i<s1.length;i++){
s3->ch[i]=s1.ch[i];
}
for(int j=0;j<s2.length;j++){
s3->ch[i+j]=s2.ch[j];
}
s3->length =s1.length+s2.length;
s3->ch[s3->length] = '\0';
}
int SubString(sstring *sub,sstring s,int pos,int len){
if(pos<1 || pos+len-1 >s.length)
return 0;
for(int i=0;i<len;i++){
sub->ch[i] =s.ch[pos+i-1];
}
sub->length =len;
sub->ch[len]= '\0';
return 1;
}
int StrCompre(sstring s1,sstring s2){
for(int i=1;i<=s1.length && i<=s2.length;i++){
if(s1.ch[i]!=s2.ch[i])
return s1.ch[i]-s2.ch[i];
}
return s1.length-s2.length;
}
int Index(sstring s1,sstring s2){
int i=1,j=1;
while(i<= s1.length && j<=s2.length){
if(s1.ch[i] == s2.ch[j]){
i++; j++;
}
else{
i=i-j+1;
j=1;
}
}
if(j==s2.length)
return i-j+1;
else
return 0;
}
int main()
{
sstring s1,s2,s3,s4;
StrAssign(&s1,"eabcd");
StrCopy(&s2,&s1);
int empty=StrEmpty(s2);
int length=StrLength(s2);
ConCat2(&s3,s1,s2);
SubString(&s4,s3,1,3);
printf("%s \n%s \n%s \n%s \n",s1.ch,s2.ch,s3.ch,s4.ch);
int compare = StrCompre(s3,s4);
int id =Index(s1,s2);
ClearString(&s2);
printf("s2判空:%d s2长度:%d s3和s4比较:%d s2在s1首次出现id:%d",empty,length,compare,id);
DestroyString(&s3);
return 0;
}
2.链式存储
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *ch;
int length;
} sstring;
void StrAssign(sstring *s1, char *s2) {
s1->ch = (char *)malloc((strlen(s2) + 1) * sizeof(char));
if (s1->ch == NULL) {
exit(1);
}
strcpy(s1->ch, s2);
s1->length = strlen(s2);
}
void StrCopy(sstring *s1, sstring *s2) {
s1->ch = (char *)malloc((s2->length + 1) * sizeof(char));
if (s1->ch == NULL) {
exit(1);
}
strcpy(s1->ch, s2->ch);
s1->length = s2->length;
}
int StrEmpty(sstring *s) {
return s->length == 0;
}
int StrLength(sstring *s) {
return s->length;
}
void ClearString(sstring *s) {
s->ch = NULL;
s->length = 0;
}
void DestroyString(sstring *s) {
free(s->ch);
s->ch = NULL;
s->length = 0;
}
void Concat(sstring *s3, sstring *s1, sstring *s2) {
s3->ch = (char *)malloc((s1->length + s2->length + 1) * sizeof(char));
if (s3->ch == NULL) {
exit(1);
}
strcpy(s3->ch, s1->ch);
strcat(s3->ch, s2->ch);
s3->length = s1->length + s2->length;
}
int SubString(sstring *sub, sstring *s, int pos, int len) {
if (pos < 1 || pos > s->length || len < 0 || pos + len - 1 > s->length) {
return 0;
}
sub->ch = (char *)malloc((len + 1) * sizeof(char));
if (sub->ch == NULL) {
exit(1);
}
strncpy(sub->ch, s->ch + pos - 1, len);
sub->ch[len] = '\0';
sub->length = len;
return 1;
}
int StrCompare(sstring *s1, sstring *s2) {
return strcmp(s1->ch, s2->ch);
}
int Index(sstring *s1, sstring *s2) {
char *pos = strstr(s1->ch, s2->ch);
if (pos) {
return pos - s1->ch + 1;
} else {
return 0;
}
}
int main() {
sstring s1, s2, s3, s4;
StrAssign(&s1, "abcd");
StrCopy(&s2, &s1);
int empty = StrEmpty(&s2);
int length = StrLength(&s2);
Concat(&s3, &s1, &s2);
SubString(&s4, &s3, 1, 3);
printf("%s\n%s\n%s\n%s\n", s1.ch, s2.ch, s3.ch, s4.ch);
int compare = StrCompare(&s3, &s4);
int id = Index(&s1, &s2);
printf("s2判空:%d s2长度:%d s3和s4比较:%d s2在s1中的位置:%d\n", empty, length, compare, id);
ClearString(&s2);
DestroyString(&s1);
DestroyString(&s2);
DestroyString(&s3);
DestroyString(&s4);
return 0;
}
3.简单模式匹配
#include <stdio.h>
#include <string.h>
int Index(char *mainString, char *pattern) {
int len1 = strlen(mainString);
int len2 = strlen(pattern);
for (int i = 0; i <= len1 - len2; i++) {
int j;
for (j = 0; j < len2; j++) {
if (mainString[i + j] != pattern[j]) {
break;
}
}
if (j == len2) {
return i;
}
}
return -1;
}
int main() {
char mainString[] = "ABABCABCACBAB";
char pattern[] = "ABCAC";
int result = Index(mainString, pattern);
if (result != -1) {
printf("Pattern found at position: %d\n", result);
} else {
printf("Pattern not found.\n");
}
return 0;
}
4.kmp算法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Index(char *pattern, int *table) {
int len = strlen(pattern);
int j = 0;
table[0] = 0;
for (int i = 1; i < len; i++) {
while (j > 0 && pattern[i] != pattern[j]) {
j = table[j - 1];
}
if (pattern[i] == pattern[j]) {
j++;
}
table[i] = j;
}
}
int KMPPatternMatch(char *mainString, char *pattern) {
int len1 = strlen(mainString);
int len2 = strlen(pattern);
int *table = (int *)malloc(len2 * sizeof(int));
BuildPartialMatchTable(pattern, table);
int i = 0, j = 0;
while (i < len1) {
if (pattern[j] == mainString[i]) {
i++;
j++;
}
if (j == len2) {
free(table);
return i - j;
}
if (i < len1 && pattern[j] != mainString[i]) {
if (j != 0) {
j = table[j - 1];
} else {
i++;
}
}
}
free(table);
return -1;
}
int main() {
char mainString[] = "ABABCABCACBAB";
char pattern[] = "ABCAC";
int result = Index(mainString, pattern);
if (result != -1) {
printf("Pattern found at position: %d\n", result);
} else {
printf("Pattern not found.\n");
}
return 0;
}
5.优化的kmp算法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void BuildNextArray(char *pattern, int *next) {
int len = strlen(pattern);
int j = -1;
next[0] = -1;
for (int i = 1; i < len; i++) {
while (j >= 0 && pattern[i] != pattern[j + 1]) {
j = next[j];
}
if (pattern[i] == pattern[j + 1]) {
j++;
}
next[i] = j;
}
}
int Index(char *mainString, char *pattern) {
int len1 = strlen(mainString);
int len2 = strlen(pattern);
int *next = (int *)malloc(len2 * sizeof(int));
BuildNextArray(pattern, next);
int j = -1;
for (int i = 0; i < len1; i++) {
while (j >= 0 && mainString[i] != pattern[j + 1]) {
j = next[j];
}
if (mainString[i] == pattern[j + 1]) {
j++;
}
if (j == len2 - 1) {
free(next);
return i - j;
}
}
free(next);
return -1;
}
int main() {
char mainString[] = "ABABCABCACBAB";
char pattern[] = "ABCAC";
int result = Index(mainString, pattern);
if (result != -1) {
printf("Pattern found at position: %d\n", result);
} else {
printf("Pattern not found.\n");
}
return 0;
}