【问题标题】:C program waits forever on scanfC程序在scanf上永远等待
【发布时间】:2013-08-18 16:38:28
【问题描述】:

我有一个实现堆栈的 C 程序。

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


struct node{
    int data;
    struct node *link;
};

struct stack{
    struct node *head;
    struct node *data_node;
};

int push(struct stack *a_stack, int i){
    a_stack->data_node = malloc(sizeof(struct node));
    if(a_stack->data_node == NULL){
        puts("Error: Cannot allocate sufficient memory.");
        exit(1);
    }
    a_stack->data_node->data = i;
    a_stack->data_node->link = a_stack->head;
    a_stack->head= a_stack->data_node;
    return 0;
}

int pop(struct stack *a_stack){
    if(a_stack->head==NULL){
        return '\n';
    }
    int temp = a_stack->head->data;
    a_stack->data_node = a_stack->head;
    a_stack->head = a_stack->head->link;
    free(a_stack->data_node);
    return temp;
}

int minimum(struct stack *a_stack){
    if(a_stack->head==NULL){
        return '\n';
    }
    int min = a_stack->head->data;
    struct node *a_node = a_stack->head;
    while(a_node!=NULL){
        if(min>a_node->data){
            min = a_node->data;
            a_node = a_node->link;
        }
    }
    return min;
}

int init_stack(struct stack *a_stack){
    a_stack->head = NULL;
    a_stack->data_node = NULL;
}

int handle_input(struct stack *test){

    char* input_string = (char*)malloc(20);
    scanf("%s", input_string);
    // gets(input_string);

    char* pop_cmd = "-";
    char* min_cmd = "min";
    int num;

    if (strcmp(pop_cmd, input_string) == 0){
        printf("%d\n", pop(test));
    }

    else{
        if (input_string[0] == 'm'){
            printf("%d\n", minimum(test));
        }
        else{
            num = atoi(input_string);
            push(test, num);
        }   
    }

    return 0;
}


int main(void){

    int no_of_input, counter;

    struct stack test;
    init_stack(&test);

    scanf("%d", &no_of_input);

    for(counter=no_of_input; counter>0; counter=counter-1){
        handle_input(&test);
    };

    return 0;
}

问题是如果我想输入“min”,这是计算数组最小元素的命令,程序会永远等待输入。找了好久还是不知道为什么会这样。

【问题讨论】:

  • 会不会是因为您在 handle_input 方法中使用了 char 指针? char* input_string = (char*)malloc(20); scanf("%s", input_string);
  • scanf 在大多数系统上不会返回,直到您键入 Enter。 (这称为行缓冲。)你在这样做吗?
  • @Gene 是的。我试过回车和 Ctrl + D。但还是没有。
  • 不要。采用。 scanf(). man 3 fgets.
  • 是不是fgets()避免缓冲区溢出:和reading a line using scanf() not good?

标签: c


【解决方案1】:

scanf 不等待,但您有无限循环 问题。在函数minimum() 中,您只能有条件地将a_node 更新到链表中的下一个节点:

  int min = a_stack->head->data;  //note
  struct node *a_node = a_stack->head; //note

   while(a_node!=NULL){
        if(min > a_node->data){<-- "Always evaluates FALSE because: min is a_node->data"
            min = a_node->data;
            a_node = a_node->link; <--"Should NOT be here"
        }
        a_node = a_node->link; <--"but it should be here"
    }

另外,if 条件(min &gt; a_node-&gt;data) 总是评估false,原因如下:

mina_stack-&gt;head-&gt;dataa_nodea_stack-&gt;head 所以 min == a_node-&gt;datemin &gt; a_node-&gt;data 总是评估 false 因为你在 if 正文中更新了 a_node

另外我发现你在函数handle_input()中有内存泄漏。您应该free() 显式动态分配内存。请阅读以下我的建议:

int handle_input(struct stack *test){
    char* input_string = malloc(20); <-- "No need to type case"  
    // code here
    free(input_string);  <-- "Add this"
    return 0;
}

【讨论】:

  • 是的,就是这样。很傻。如果允许,我会在大约 5 分钟内接受您的回答。谢谢:)
  • 但解决第一个问题会自动解决我猜的第二种情况
  • @tarashish 不,你有只有第一个问题,其次只有让你的代码执行一次不必要的迭代!
  • 这个条件在第一次迭代时仍然没有用。
【解决方案2】:

另外,在:

int init_stack(struct stack *a_stack){
    a_stack->head = NULL;
    a_stack->data_node = NULL;
}

我认为它应该返回 void 而不是 int。

handle_input() 中的 min_cmd 未使用。

【讨论】:

  • 同意。代码中使用了 min_cmd 和 handle_input,只是本次修订中没有。
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多