C语言-循环意外结束

3

我正在尝试编写一个C语言中的中缀转后缀程序,但是当我开始输入符号时,循环在第一个输入处就结束了。

我相信这个问题某处是数据类型问题,但我无法找到原因所在。

以下是代码:

#include <stdio.h>
#include <stdlib.h>

static int N;
static char *s;

void stackinit(int max){
    s = malloc(max*sizeof(int));
    N = 0;
}

int stackempty(){
    if(N==0)
        return(1);
    else
        return(0);
}

void stackpush(char item){
    s[N] += item;
    N++;
}

int stackpop(){
    N--;
    return(s[N]);
}

int priority(char x){
    if(x == '+' || x == '-')
        return(0);
    if(x == '*' || x == '/')
        return(1);
}
int main(void){
    int i,sum;
    char input;

    printf("Infix to Postfix\n");
    printf("How many characters will you enter?");
    scanf("%d", &sum);
    stackinit(sum);

    for(i = 0; i < sum; i++){
        printf("Enter character: ");
        scanf("%s", &input);
        stackpush(input);
    }
    while(!stackempty()){
        printf("%d ", stackpop());
    }
    /*for(i = 0; i < sum; i++){

    }*/     
}

scanf("%s", &input); 应该改为 scanf("%c", &input); - Adam Burry
顺便提一下,在 stackPush 中,你不需要使用 +=,只需要用 = - Scott Mermelstein
我之前尝试过%c,但它会连续打印出与我所要求次数相同的“Enter”字符,之后我就只能输入一个字符了。 - Veske
@Veske:是的,这种情况经常发生。要找出原因,请阅读此文:https://dev59.com/yGvXa4cB1Zd3GeqPLazH - Fred Larson
你的推入和弹出程序应该检查已分配的堆栈大小,以及堆栈是否已经为空。 - Phil Perry
1个回答

5

scanf()使用%c来读取字符,因此您的代码应该是:

scanf(" %c", &input);

通过在你的%c占位符后添加一个空格,你还可以消耗任何可能意外添加的换行符或空格字符,从而纠正你的循环问题。
另外,你需要在字符串末尾添加一个额外的字符:一个空字符,即'\0'字符。这就是为什么你需要做s = malloc(max*sizeof(int) + 1);,以便留出空间给你的'\0',在你的情况下,你可以在你的stackPush()函数中动态地添加它,像这样:
void stackpush(char item){
    s[N++] = item;
    s[N] = '\0';
}

此外,在您的 stackPush 函数中,您需要的是 s[N] = item;,而不是 s[N] += item;了解更多关于 C 字符串的信息

但是这样会将我的每个字符都加在一起吗?如果我输入 asd+-+,那么我希望它以后也像字符串一样存在于 s 中。 - Veske
好的,我已经明白了。您能告诉我为什么在打印stackpop时输出的实例少了1个吗?我输入了4个字符,但只打印了3个。当我用数字做同样的事情时,它没有这样做。 - Veske
你现在用编辑器把scanf改成了这样:" %c"。虽然它解决了问题,但我不太明白它具体做了什么。 - Veske
当您读取sum值时,会消耗您之前键入的换行符\n。因此,循环中的第一个scanf()正在读取它。通过在说明符之前放置空格,可以首先消耗保留在缓冲区中的任何垃圾,然后再读取字符。之前发生的情况是相反的,导致了错误。这足够清楚吗?如果不清楚,我可以更新我的答案 :-) - Natan Streppel
1
谢谢你的回答!非常有帮助 :) - Veske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接