#include
#include
#include
#define MAX 40
typedef struct {
char ch[MAX];
int len;
}SString;
//初始化
void Get(SString* s) {
int x;
printf("请输入一串字符:");
while ((x = getchar()) != '\n') {
if (s->len > MAX - 1) {
printf("串空间已满,已截断!\n");
while ((x = getchar()) != EOF && x != '\n');
break;
}
s->ch[(s->len++)] = x;
}
}
//输出函数
void Put(SString s) {
int i;
printf("len:%d\t", s.len);
printf("s:");
for (i = 0; i < s.len; i++) {
printf("%c", s.ch[i]);
}
printf("\n");
}
//插入函数
int StrInsert(SString* s) {
int i,pos;
printf("请输入插入的位置:");
scanf_s("%d", &pos);
SString t = { "",0 };
Get(&t);
if (pos<0 || pos>s->len) return 0;
if (s->len + t.len <= MAX) {
for (i = s->len + t.len - 1; i >= t.len + pos; i--) {
s->ch[i] = s->ch[i - t.len];
}
for (i = 0; i < t.len; i++) {
s->ch[i + pos] = t.ch[i];
}
s->len = s->len + t.len;
}
else if(pos + t.len <= MAX) {
for (i = MAX - 1; i > t.len + pos - 1; i--) {
s->ch[i] = s->ch[i - t.len];
}
for (i = 0; i < t.len; i++) {
s->ch[i + pos] = t.ch[i];
}
s->len = MAX;
}
else {
for (i = 0; i < MAX - pos; i++) {
s->ch[i + pos] = t.ch[i];
}
s->len = MAX;
}
return 1;
}
//删除函数
int StrDelete(SString* s) {
int i,pos,len;
printf("请输入删除的位置及长度:");
scanf_s("%d %d", &pos, &len);
if (pos<0 || pos>(s->len - len)) return 0;
for (i = pos + len; i < s->len; i++) {
s->ch[i - len] = s->ch[i];
}
s->len = s->len - len;
return 1;
}
//简单匹配
int StrIndex(SString s) {
int i, j, start,pos;
printf("请输入开始匹配的位置:");
scanf_s("%d", &pos);
printf("开始创建模式串:");
SString t = { "",0 };
Get(&t);
if (t.len == 0) return 0;
start = pos;
i = start;
j = 0;
while (i < s.len && j < t.len) {
if (s.ch[i] == t.ch[j]) {
i++;
j++;
}
else {
start++;
i = start;
j = 0;
}
}
if (j >= t.len) return (start);
else return (-1);
}
//结果判断
void Judge(int result) {
if (result == -1) {
printf("失败!");
}
else if (result == 1) {
printf("成功!");
}
else {
printf("%d", result);
}
}
int main() {
SString Str_A = { "",0 };
Get(&Str_A);
loop:
int choose=0;
printf("请选择: 1.输出 2.插入 3.删除 4.简单匹配 5.kmp模式匹配 6.结束\n");
scanf_s("%d", &choose);
switch (choose) {
case 1:
goto PUT;
break;
case 2:
goto STRI;
break;
case 3:
goto STRD;
break;
case 4:
goto STRL;
break;
case 6:
break;
default:
printf("输入不合法!");
goto loop;
break;
}
PUT:
Put(Str_A);
system("pause");
system("cls");
goto loop;
STRI:
Judge(StrInsert(&Str_A));
system("pause");
system("cls");
goto loop;
STRD:
Judge(StrDelete(&Str_A));
system("pause");
system("cls");
goto loop;
STRL:
int end;
end = StrIndex(Str_A);
if (end == -1) {
printf("匹配不成功!");
}
else {
printf("匹配位置为:%d", end);
}
system("pause");
system("cls");
goto loop;
return 0;
}
在loop中,比如想要实现插入或者什么,只要涉及了Get函数就会出现函数结束问题。
在这个代码中,scanf_s 函数在读取输入时,不会自动清除输入缓冲区中的换行符。因此,当你从 scanf_s 切换到 getchar 时,getchar 会立即读取缓冲区中剩余的换行符,导致你的 Get 函数提前结束。