链接列表问题

时间:2013-08-16 22:28:57

标签: c list linked-list

有谁知道以下代码可能存在什么问题?当我运行它时,我得到以下输出:

Insert a value in the list: 1
Do you want to continue? y/N: 
 1 ->

事实是do-while循环执行到scanf("%c", &ch)语句,然后它跳出(因此我无法为ch变量提供任何输入)。我尝试用GDB调试,我收到了一些奇怪的消息:

GI___libc_malloc (bytes=16) at malloc.c:malloc.c: No such file or directory. 

此外,它表示编译器无法找到vscanf.c文件。有没有人对这种奇怪的行为有解释?谢谢! (目的是以相反的顺序打印单链表的值。)

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

struct node{
    int info;
    struct node* next;
};

struct node* head = 0;

void add_node(int value){

     struct node* current = malloc(sizeof(struct node));
     current->info = value;
     current->next = head;
     head = current;
 }

void print_node(struct node* head){

     while(head){

          printf(" %d -> ", head->info);
          head = head->next;
     }

     printf("\n");
 }

int main(void){

    int val;
    char ch;

    do {

       printf("Insert a value in the list: ");
       scanf("%d", &val);
       add_node(val);
       printf("Do you want to continue? y/N: ");
       scanf("%c", &ch);

    } while(ch == 'y' || ch == 'Y');

    printf("\n");
    print_node(head);
    return 0;
 }

3 个答案:

答案 0 :(得分:2)

如果您希望输入由新行分开(您可以看到它),请更改您在角色中阅读的格式。更改以下内容:

scanf( "%c", &ch );

......对此:

scanf( "\n%c", &ch ); // << Note, \n to pickup newline before reading the value.

答案 1 :(得分:2)

您可以在if-else块中检查正确的输入,并相应地执行您的代码。 例如,如果我需要检查用户是否要继续,我会做以下事情:

char chTemp; //Declare a test variable to check for newline
printf("Do you want to continue? y/N: ");
if (scanf("%c%c",&ch,&chTemp) != 2 || chTemp != '\n')
{
     printf("Error in input (Integer input provided)");
}
else
{
     //Do stuff.
}

它不仅会解决您的问题,还会检查粗心的整数输入。

答案 2 :(得分:0)

您遇到的问题是因为您为val键入一个值然后按Enter键,然后\n仍然保留在输入缓冲区中。因此,下一个scanf假设仍在输入缓冲区中的\n是其输入,并使用它然后循环退出。

其他解决方案: -

1)scanf("%d%*c",&val);

这会将第一个输入字符分配给val,之后的任何内容都会被吃掉。因此,\n不会进入下一个scanf

2)scanf("%[^\n]%*c",&val);

这会将任何内容分配给除val之外的\n,然后\n会被吃掉。