为什么这个程序即使在我输入N后,依然询问我是否要录入书籍信息,是没有break出去吗

为什么这个程序即使在我输入N后,依然询问我是否要录入书籍信息,是没有break出去吗?


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

struct Book
{
    char title[128];
    struct Book *next;
};

void addBook(struct Book **lbr);
void getInput(struct Book *book);
void printlbr(struct Book *lbr);
void release(struct Book **lbr);

void addBook(struct Book **lbr)
{
    struct Book *book,*temp;
    book = (struct Book *)malloc(sizeof(struct Book));
    
    if(book == NULL)
    {
        printf("内存分配失败\n");
        exit(1);
    }
    
    getInput(book);
    
    if(*lbr != NULL)
    {
        temp = *lbr;
        *lbr = book;
        book = temp;
    }
    else
    {
        *lbr = book;
        book->next = NULL;
    }
}

void getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s",book->title);
}

void printlbr(struct Book *lbr)
{
    struct Book *book;
    int count = 1;
    
    book = lbr;
    while(book != NULL)
    {
        printf("Book%d",count);
        printf("书名:%s",book->title);
        book = book->next;
        count++;
    }
}

void release(struct Book **lbr)
{
    struct Book *temp;
    
    while(lbr != NULL)
    {
        temp = *lbr;
        *lbr = (*lbr)->next;
        free(temp);
    }
}

int main(void)
{
    struct Book *lbr;
    int ch;
     
    while(1)
    {
        printf("请问是否需要录入书籍信息(Y/N):");
        do
        {
            ch = getchar();
        }while(ch != 'Y' && ch != 'N');
    
        if(ch = 'Y')
        {
            addBook(&lbr);
        }
        else
        {
            break;
        }
    }
    
    printf("请问是否需要打印书籍信息(Y/N):");
    do
    {
        ch = getchar();
    }while(ch != 'Y' && ch != 'N');
    
    if(ch = 'Y')
    {
        printlbr(lbr);
    }
    
    release(&lbr);
    
    return 0;
}

if(ch = 'Y')
->
if(ch == 'Y')

第88行 第104行 两行:if(ch = 'y') 少了 ‘=’ ,应是:if (ch == 'y')

【以下回答由 GPT 生成】

问题的原因在于在addBook函数中没有添加跳出循环的条件判断,导致程序无法跳出循环并询问是否要录入书籍信息。

为了解决该问题,可以在addBook函数中添加一个循环,当用户输入"N"时跳出循环。具体步骤如下:

  1. addBook函数开始前添加一个字符串变量choice用于接收用户的输入。
char choice[2];
  1. 在获取书籍信息之前,使用while循环进行判断,当用户输入的不是"N"时继续循环,否则跳出循环。
while(1)
{
    printf("是否要录入书籍信息?(Y/N) ");
    scanf("%s", choice);

    if(strcmp(choice, "N") == 0)
    {
        break;
    }

    // 获取书籍信息的代码
}
  1. 在循环内部获取书籍信息的代码。
getInput(book);

if(*lbr != NULL)
{
    temp = *lbr;
    *lbr = book;
    book = temp;
}
else
{
    *lbr = book;
    book->next = NULL;
}

完成以上步骤后,重新运行程序,当输入"N"时,程序将会跳出循环,不再询问是否要录入书籍信息。完整代码如下所示:

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

struct Book
{
    char title[128];
    struct Book *next;
};

void addBook(struct Book **lbr);
void getInput(struct Book *book);
void printlbr(struct Book *lbr);
void release(struct Book **lbr);

void addBook(struct Book **lbr)
{
    struct Book *book, *temp;
    char choice[2];
    book = (struct Book *)malloc(sizeof(struct Book));

    if(book == NULL)
    {
        printf("内存分配失败\n");
        exit(1);
    }

    while(1)
    {
        printf("是否要录入书籍信息?(Y/N) ");
        scanf("%s", choice);

        if(strcmp(choice, "N") == 0)
        {
            break;
        }

        getInput(book);

        if(*lbr != NULL)
        {
            temp = *lbr;
            *lbr = book;
            book = temp;
        }
        else
        {
            *lbr = book;
            book->next = NULL;
        }
    }
}

void getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s", book->title);
}

void printlbr(struct Book *lbr)
{
    struct Book *book;
    int count = 1;

    book = lbr;
    while(book != NULL)
    {
        printf("Book%d", count);
        printf("书名:%s", book->title);
        book = book->next;
    }

    // ...其他代码
}

希望以上解决方案能够帮助到您,如果有任何疑问,请随时询问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^