/总结/
字符串的输入在这里我遇到困难,比如你用scanf()向数组存入字符时发现用 %c与%s效果完全不一样,用%c时系统默认数组[0]里存的是空你输出该数组是没有东西的,只有一个很长的空白。你在利用scanf输入时是不用在最后一个数组添加’\0’,系统自动添加(这里包括%s,%c),我发现你用scanf %c输入时内存空间要多留一位,这个空间是在数组开头不是最后的,这里我也不太懂,如果不留的话你将输出少一个字符的字符串,缺省字符是最后一个,输出%c和%s也是不一样的,%c是一个字符一个字符输出。%s是按数组输出,%s是当输出到\n,\t,‘\0’,才会停止,如果没有在字符串后就会输出乱码,所以上面在赋值时在后面加结束标识,%c是不用在最后添加’\0’,也没啥影响的他只会一个一个输出,这就跟你让数组输出哪一个下标一样,需要循环输出, 如果你输入的时候用%c输出的时候用%s,好像效果也不一样,到底系统在数组最后添加了’\0’,还是没有我没试过,但是你用%s输入,再用%c输出肯定没有影响。这个在字符串后添加结束标识的操作是你自己给某个数组赋值的时候才需要添加,如果用scanf赋值是系统给你自动添加的
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char*data;//指向molloc的内存
int Length;//串的当前长度
}String;
//串的赋值
void StrAssing(String*L){
char a[100]="";
L->Length=0;
scanf("%s",&a);//当你输入完会自动在字符串后加'\0',这里不用自己加,这里是输入的,如果你是赋值才需要加
while(a[L->Length]!='\0')
{
L->Length++;
}
if(L->Length==0){
L->data=NULL;
}
else{
int i;
L->data=(char*)malloc((L->Length)*sizeof(char));//动态存储生成存储空间
for(i=0;i<L->Length;i++){
L->data[i]=a[i];
}
L->data[L->Length]='\0';//字符串结束标志位
}
}
/*求字符串的串长*/
int StringLength(String*L){
int i=0;
while(L->data[i]!='\0'){
i++;
}
return i;
}
/*销毁串*/
void DestroyString(String*L){
free(L->data);
}
/*比较两个字符串*/
int Strcompare(String*L,String*H){
int i;
while(i>L->Length || i>H->Length){
if(L->data[i]>H->data[i]){
return 1;
}
else if(L->data[i]<H->data[i]){
return -1;
}
i++;
}
return 0;
}
/*连接两个字符串*/
void concat(String*L,String*H,String*K){
int i,j=0;
K->Length=L->Length+H->Length;
K->data=(char*)malloc(K->Length*sizeof(char));
if(!K->data){
printf("扩容失败\n");
}
for(i=0;i<L->Length;i++){
K->data[j]=L->data[i];
j++;
}
for(i=0;i<H->Length;i++){
K->data[j]=H->data[i];
j++;
}
K->data[K->Length]='\0';//字符串尾部添加结束标识
}
/*暴力破解字符匹配*/
void index_BF(String*L,String*H){
int i,j;
printf("请输入从主串哪个下标开始配对\n");
scanf("%d",&i);
while(!i){
printf("输入错误请从新输入\n");
scanf("%d",&i);
}
while(i-1<L->Length && j<H->Length){
if(L->data[i]==H->data[j]){
i++;
j++;
}
else{
i=i-j+1;j=0;//如果匹配主串下标往后加一,字串重新开始
}
}
if(j>=H->Length){//判断如果子串能匹配到大于等于自身长度推出while循环说明子串在主串里
printf("匹配成功,子串在主串下标%d开始,长度为%d\n",i-H->Length+1,H->Length); //主串匹配时的长度减去字串长度等于子串在主串开始时的下标(长度)
}
else{
printf("子串不存在主串中\n");
}
}
int main(){
String L;
String H;
String K;
printf("请输入主串的字符\n");
StrAssing(&L);
printf("请输入子串的字符\n");
StrAssing(&H);
printf("主串的长度为:%d\n",StringLength(&L));
printf("子串的长度为:%d\n",StringLength(&H));
concat(&L,&H,&K);//连接字串和主串
printf("主串和子串连接后的效果:");
printf("%s\n",K.data);
printf("连接后的长度:%d\n",StringLength(&K));
index_BF(&L,&H);//暴力匹配BF
DestroyString(&L);
DestroyString(&H);
DestroyString(&K);
return 0;
}
#效果展示
#失败效果
#成功效果