关于一次循环重复使用printf的问题(语言-c语言)

问题遇到的现象和发生背景

一次循环使用两次printf

用代码块功能插入代码,请勿粘贴截图

#include
#include
#include"SqStack.h"
main.cpp
int main(){
SqStack S;
char e,p;
int n;
InitStack(S);
printf("请输入:");
scanf("%c",&e);
while(e!='&'){
Push(S,e);
printf("入栈成功\n");
printf("请继续输入:");
scanf("%c",&e);
}
printf("请继续输入:");
scanf("%c",&e);
while(e!='@'&&S.top!=S.base){
p=Pop(S);
if(e!=p){
printf("no");
return 0;
}
printf("出栈成功\n");
printf("请继续输入:");
scanf("%c",&e);
}
if(S.top=S.base)printf("yes");
}

SqStack.h
#include
#include
#define MaxSize 100
#define StackinCrement 10
typedef struct SqStack{
char top; //栈顶指针
char base; //栈底指针
int stacksize; //栈可用最大容量
}SqStack;
//初始化
InitStack(SqStack &S){
S.base = (char
)malloc( MaxSize
sizeof(char) );
if(!S.base)
printf("分配存储空间失败"); //存储分配失败
S.top = S.base; //栈顶指针等于栈底指针
S.stacksize = MaxSize;
printf("初始化成功\n");
return 0;
}
//顺序栈的入栈
void Push(SqStack &S,char e)
{
if(S.top - S.base >= S.stacksize) //栈满,扩容
{
S.base = (char*)realloc(S.base,(S.stacksize +StackinCrement)*sizeof(char));
if(!S.base)
printf("分配存储空间失败");
S.top = S.base + S.stacksize;
S.stacksize += StackinCrement;
}
*S.top++ =e;
}
//顺序栈的出栈
char Pop(SqStack &S){
char e;
if(S.top == S.base)
printf("无出栈的");
e = *--S.top;
return e;
}

运行结果及报错内容

img

换行也是字符,你不写个getchar把它读进来,那么scanf里就会接受到一个换行

修改完善如下,供参考:

//SqStack.h
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
#define StackinCrement 10
typedef struct SqStack {
    char *top;  //栈顶指针    
    char *base; //栈底指针    
    int stacksize; //栈可用最大容量
}SqStack;
//初始化
int InitStack(SqStack& S) {  //修改
    S.base = (char*)malloc(MaxSize*sizeof(char));
    if (!S.base) {
        printf("分配存储空间失败"); //存储分配失败
        return -1;            //修改 
    }
    S.top = S.base; //栈顶指针等于栈底指针
    S.stacksize = MaxSize;
    printf("初始化成功\n");
    return 0;
}
//顺序栈的入栈
void Push(SqStack& S, char e)
{
    if (S.top - S.base >= S.stacksize) //栈满,扩容
    {
        S.base = (char*)realloc(S.base, (S.stacksize + StackinCrement) * sizeof(char));
        if (!S.base) {
            printf("分配存储空间失败");
            return;           //修改
        }
        S.top = S.base + S.stacksize;
        S.stacksize += StackinCrement;
    }
    *S.top++ = e;
}
//顺序栈的出栈
char Pop(SqStack& S) {
    char e;
    if (S.top == S.base) {
        printf("栈已空\n");
        e = '\0';         //修改
        return e;         //修改
    }
    e = *--S.top;
    return e;
}

//#include <stdio.h>
//#include <malloc.h>
//#include"SqStack.h"
//main.cpp
int main() {
    SqStack S;
    char e, p;
    int n;
    InitStack(S);
    printf("请输入:");
    scanf(" %c", &e);      //修改
    while (e != '&') {
        Push(S, e);
        printf("入栈成功\n");
        printf("请继续输入:");
        scanf(" %c", &e);  //修改
    }
    //printf("请继续输入:"); //修改
    //scanf(" %c", &e);      //修改
    while (S.top != S.base) { //(e != '@' && S.top != S.base)
        p = Pop(S);
        //if (e != p) {     //修改
        //    printf("no\n"); //修改
        //    return 0;       //修改
        //}
        printf("出栈成功:%c\n", p); //修改
        //printf("请继续输入:");  //修改
        //scanf(" %c", &e);  //修改
    }
    if (S.top == S.base) printf("yes"); //if (S.top = S.base) 修改
}