c语言loop循环中函数实现问题


#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 函数提前结束。