首页 > 解决方案 > C 读取字符串字符时出错。尝试从字符串打印但没有成功

问题描述

我正在编写代码,我需要从“addReasons”函数中获取字符串并打印我在其他函数中得到的所有字符串,如果有人能告诉我如何解决它,我会收到运行时错误,上面写着“错误读取字符串的字符”会很有帮助。谢谢你。

像这样调用函数:

addReasons(&proList);
addReasons(&conList);
printList(proList);
printList(conList);

编码:

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

/*
Function will add a reason to the list
input: the list to add to and its name
output: none
*/
void addReason(reasonList* list)
{
    int index = 0;
    index = list->numReasons;
    if (index < MAX_LIST_LENGTH)
    {
        printf("Enter a reason to add to list %s: ", list->listName);
        fgets(&list->reasons[index], STR_LEN, stdin);
        list->numReasons++;
    }
}
/*
Function will print a list of reasons
input: the list
output: none
*/
void printList(reasonList list)
{
    int i = 0;
    printf("List %s\n", list.listName);
    printf("---------\n");
    for (i = 0; i < list.numReasons; i++)
    {
        printf("%s\n", list.reasons[i]);
    }
}

标签: cstructdynamic-memory-allocationc-stringsfgets

解决方案


fgets期待一个char*论点,但你传递了一个char**论点。编译器对此发出警告:

warning: incompatible pointer types passing 'char **' to parameter of type 'char *';
remove & [-Wincompatible-pointer-types]
   fgets(&list->reasons[index], STR_LEN, stdin);
         ^~~~~~~~~~~~~~~~~~~~~

正确的方法是:

    fgets(list->reasons[index], STR_LEN, stdin);

但是,现在这将使用未初始化的指针。因此,您需要首先为该字符串分配内存并使用该地址初始化指针:

    list->reasons[index] = malloc(STR_LEN);
    fgets(list->reasons[index], STR_LEN, stdin);

free()稍后当你完成它时,你还需要该内存,否则如果你的程序长时间运行,你会泄漏该内存。


推荐阅读