c - 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]);
}
}
解决方案
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()
稍后当你完成它时,你还需要该内存,否则如果你的程序长时间运行,你会泄漏该内存。
推荐阅读
- sql - SQL 语句可以在 rails 控制台输出但不在视图中(rails 6)
- css - 卡片宽度没有调整到相同的宽度尺寸,并且一行只有 3 张卡片
- javascript - 如何保持下一行的执行直到上一行完成其循环?
- java - OpenFeign 客户端不应用“Content-Type”标头值:415 作为响应
- c# - nLog混合windows服务中多个日志文件中的info语句
- php - Laravel 应用程序中的 Artisan::call('route:cache') 崩溃
- arrays - 如何更新 Mongodb 中的多个大子元素
- html - 在桌面和移动/手风琴/移动 div 上的正确位置显示 div?
- flutter - 在页面视图中颤动空白页
- docker - Odoo 容器停止并被移除,但 odoo 仍在执行中