【问题标题】:C structures — problem entering more than one stringC 结构——输入多个字符串的问题
【发布时间】:2021-04-28 14:08:52
【问题描述】:

我正在尝试向结构中的字符串添加多个字符串,当我到达“fgets”行时,程序就会崩溃/关闭。如果有人知道我的代码中存在什么问题,我将非常感激。 我正在调试代码,问题出在 "fgets" 行中的函数 "addReason" 中,但我不明白到底是什么问题。

我的代码:

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

#define PRO_OP 1
#define CON_OP 2
#define PRINT_OP 3
#define EXIT_OP 4

#define STR_LEN 50
#define MAX_LIST_LENGTH 10

typedef struct reasonList
{
    char* listName;
    char* reasons[MAX_LIST_LENGTH];
    int numReasons;
} reasonList;


void initList(reasonList* list, char* name);
void addReason(reasonList* list);
void printList(reasonList* list);
int menu(void);
void myFgets(char str[], int n);
void deleteList(reasonList* list);

int main(void)
{
    char dillema[STR_LEN] = { 0 };
    int op = 0;
    reasonList proList;
    initList(&proList, "PRO");
    reasonList conList;
    initList(&conList, "CON");
    printf("What is your dillema?\n");
    myFgets(dillema, STR_LEN);
    while (op != EXIT_OP)
    {
        op = menu();

        switch (op)
        {
            case(PRO_OP):
                addReason(&proList);
                break;
            case(CON_OP):
                addReason(&conList);
                break;
            case(PRINT_OP):
                printf("Your dillema:\n");
                printf("%s\n\n", dillema);

                printList(&proList);
                printList(&conList);
                break;
            case(EXIT_OP):
                deleteList(&proList);
                deleteList(&conList);
                break;
        }
    }
    printf("Good luck!\n");
    getchar();
    return 0;
}
/*
Function will add a reason to the list
input: the list to add to and its name
output: none
*/
void addReason(reasonList* list)
{
    printf("Enter a resone to add to list %s:\n", list->listName);
    fgets(list->reasons[list->numReasons], STR_LEN, stdin);
    list->reasons[strcspn(list->reasons[list->numReasons], '\n')] = '\0';
    list->numReasons++;
}

【问题讨论】:

标签: c


【解决方案1】:

您必须在读取字符串之前分配缓冲区并分配它。

void addReason(reasonList* list)
{
    printf("Enter a resone to add to list %s:\n", list->listName);
    list->reasons[list->numReasons] = malloc(STR_LEN); /* allocate buffer */
    if (list->reasons[list->numReasons] == NULL) return; /* check if allocation succeeded */
    fgets(list->reasons[list->numReasons], STR_LEN, stdin);
    list->reasons[strcspn(list->reasons[list->numReasons], '\n')] = '\0';
    list->numReasons++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    相关资源
    最近更新 更多