定长串的下标为0的数组分量闲置不用,从下标为1的分量开始存储
//定长串.cpp
#include<stdio.h>
#include<string.h>
#define MAXLEN 255
typedef struct{
char ch[MAXLEN+1];
int length;
}SString, *string;
//串的初始化
void initString(string s){
s->length = 0;
}
//串的赋值
void scanfStr(string s){
int i;
char str[100];
printf("请输入串:\n");
gets(str);
for (i = 1; i <= strlen(str); i++) {
s->ch[i] = str[i-1];
}
s->length = strlen(str);
}
//串的输出
void printStr(string s){
int i;
for (i = 1; i <= s->length; i++) {
printf("%c", s->ch[i]);
}
printf("\n");
}
//串的清空
void clearStr(string s){
int i;
for (i = 1; i <= s->length; i++){
s->ch[i] = '\0';
}
s->length = 0;
printf("串已清空!\n");
}
//插入串
void insertStr(string s, int pos){ //pos为插入的位置
int i = 0;
char str[100];
if(pos > s->length){
printf("插入位置超过串的长度!\n");
return;
}
printf("请输入要插入的串:\n");
gets(str);
s->length = s->length + strlen(str);
if (s->length > MAXLEN) {
printf("串超过最大长度,无法插入!");
}
for (i = s->length; i >= (s->length-strlen(str)); i--) {
s->ch[i] = s->ch[i-strlen(str)];
}
for (i = 1; i <= strlen(str); i++) {
s->ch[i+pos] = str[i-1];
}
}
//查找子串(自选)
int findStr(string s, int pos){//返回模式str在主串s中第pos个字符开始第一次出现的位置
int i=pos, j=0;
char str[100];
printf("请输入想要查找的子串:\n");
gets(str);
while(i<=s->length && j<=strlen(str)-1){
if(s->ch[i]==str[j]){
i++;
j++;
}
else{
i = i-j+2;
j = 1;
}
}
if(j > strlen(str)-1)
return i-strlen(str);
else
return 0;
}
//主函数
int main(){
int pos;
string str;
initString(str);
printf("串初始化成功!\n");
scanfStr(str);
printf("打印串:\n");
printStr(str);
insertStr(str, 2); //在串的第二个位置插入
printf("打印串:\n");
printStr(str);
pos = findStr(str, 1);
printf("第一次子串出现的位置为:%d\n", pos);
printf("清空串:\n");
clearStr(str);
printf("打印串:\n");
printStr(str);
}