c-链表故障



有人知道下面的代码可能有什么问题吗?当我运行它时,我得到以下输出:

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;
 }

如果您希望输入由新行分隔(看起来是您这样做的),那么请更改读取字符的格式。更改如下:

scanf( "%c", &ch );

到此:

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

您可以在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.
}

它不仅可以解决您的问题,还可以检查是否有粗心的整数输入。

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

其他解决方案:-

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

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

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

这将把除n之外的任何东西分配给val,然后n将被吃掉。

相关内容

  • 没有找到相关文章

最新更新