do ... while循环问题与双向链表

时间:2016-07-07 14:48:35

标签: c

所以我为了练习而实现了这个简单而无用的双链表。这是一份运动员名单和他们参加的运动。每个节点定义如下:

typedef struct node {
char* name;
char* sport;
struct node* prev;
struct node* next;
}node;

我在main中创建了列表的第一个节点(node * head是全局定义的):

head = malloc(sizeof(node));
if (head == NULL) {
    printf("malloc failed");
    return 1;
}
head->name = "Stephen Curry";
head->sport = "Basketball";
head->next = NULL;
head->prev = NULL;

这个while循环旨在允许用户在终端上添加他/她想要的节点:

char names[50]; // declaring the arrays wherein the names and sports will be stored temporarily
char sports[30];
char YorN; // this will store the result from the prompt
do {
    printf("name: ");
    fgets(names, 50, stdin);
    strtok(names, "\n"); // removing the "\n" that fgets adds so that name and     sport will be printed on the same line

    printf("sport: ");
    fgets(sports, 30, stdin);

    addNode(names, sports); // adds node to the head of the list
    printReverse(); // prints the list in reverse, giving the illusion that the user is adding to the tail

    printf("add a new name to the list? (Y or N): ");
    YorN = fgetc(stdin);
    YorN = toupper(YorN);
} while (YorN == 'Y');

第一次进入时效果很好。输出:

name: Reggie Miller
sport: Basketball
Stephen Curry,Basketball
Reggie Miller,Basketball
add a new name to the list? (Y or N):

之后,如果用户选择" Y"为了添加一个新节点,终端打印出这个:

name: sport:

仅允许用户进入运动。然后输出:

name: sport: k
Stephen Curry,Basketball

,k


,k

add a new name to the list? (Y or N):

其中" k"是进入的运动。我不认为我的addNode()或printReverse()函数存在问题,所以我为了简洁起见省略了这些问题。但是,如果有人认为这可能是这些功能的问题,或者只是想看到它们,我很乐意发布它们。在我看来这是循环的某些方面的问题,也许我的fgets的实现?当我尝试scanf时,即使是第一次尝试也失败了。非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

getc(stdin)'\n'留给stdin。所以第二个循环fgets会立即退出。

您可以在循环结束时对fgetc(stdin);执行虚拟调用。

或者您fgets读出"Y\n"输入字符串。

char answer[3];
fgets(answer, sizeof(answer), stdin);
YorN = toupper(answer[0]);