C - Loop意外结束

时间:2014-02-26 20:26:05

标签: c

所以我试图在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++){

    }*/     
}

1 个答案:

答案 0 :(得分: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;

More on C Strings