向链表插入字符串时出现换行,fixed时出现异常行为?
When inserting strings into linked list, newline occurs, and when fixed causes anomalous behavior?
我对 C 中的链接列表相当陌生,我很确定我在正确的轨道上,但我一直坚持这一点,因为我不知道是什么导致了这个输出。这会导致问题,因为由于字符串格式的奇怪行为,我在搜索节点时无法匹配字符串。
我试过 node->title[strcspn(node->title, "\n")] = 0;
但是当我在插入方法中使用它时,它并没有按照我的意愿执行。例如,我们有 Title: [HARDWARE\n]
并调用 (strcspn) 结果是
[Title: [HARDWARE
而不是 Title: [HARDWARE]
P.S。我只使用括号来解释字符串中多余的无关字符,因此我可以使用 strcmp() 比较它们。
有谁知道如何解决这个问题?
Enter title:
HARDWARE
TITLE to search for: [HARDWARE]
Current: []
]urrent: [ELECTRONICS
]urrent: [OUTSIDE GARDEN
]urrent: [INDOOR GARDEN
]urrent: [MILLWORK
]urrent: [LUMBER
]urrent: [APPLIANCES
]urrent: [HARDWARE
...
这是在使用上述任一行后打印 curr->title 时的输出。
我唯一做的另一件事是在我的主菜单中列出打印列表下方的其他功能菜单,但这是与填充链接列表中的节点相关的逻辑。
您的代码无效。
例如,函数 insertSortedList
(与函数 search
一样)会产生多个内存泄漏,而且还有未定义的行为。
这些内存分配
node = (node *) malloc(sizeof(node));
curr = (node *) malloc(sizeof(node));
没有意义。分配的内存未使用,将丢失。
结点head
一般可以等于NULL
。因此,访问例如空指针的数据成员 next
会调用未定义的行为。
除此之外,指向头节点的指针在函数内没有改变,因为它是通过引用传递给函数的。
我将展示如何编写函数。尝试自己更新其他功能。
int insertSortedList( node **head,
const char *title,
const char *category,
double time)
{
node *node = malloc( sizeof( node ) );
int success = node != NULL;
if ( success )
{
strcpy( node->title, title );
node->title[ strcspn( node->title, "\n" ) ] = '[=11=]';
strcpy( node->category, category );
node->category[ strcspn( node->category, "\n" ) ] = '[=11=]';
node->time = time;
while ( *head != NULL && !( strcmp( node->title, ( *head )->title ) < 0 ) )
{
head = &( *head )->next;
}
node->next = *head;
*head = node;
}
return success;
}
并且该函数至少可以像
那样调用
insertSortedList(&head, title, category, time);
^^^^^
如果您使用的系统附加了从文件中读取的带有两个符号 '\r'
和 '\n'
的字符串,那么您可以使用以下调用 strcspn
node->title[ strcspn( node->title, "\r\n" ) ] = '[=13=]';
我对 C 中的链接列表相当陌生,我很确定我在正确的轨道上,但我一直坚持这一点,因为我不知道是什么导致了这个输出。这会导致问题,因为由于字符串格式的奇怪行为,我在搜索节点时无法匹配字符串。
我试过 node->title[strcspn(node->title, "\n")] = 0;
但是当我在插入方法中使用它时,它并没有按照我的意愿执行。例如,我们有 Title: [HARDWARE\n]
并调用 (strcspn) 结果是
[Title: [HARDWARE
而不是 Title: [HARDWARE]
P.S。我只使用括号来解释字符串中多余的无关字符,因此我可以使用 strcmp() 比较它们。
有谁知道如何解决这个问题?
Enter title:
HARDWARE
TITLE to search for: [HARDWARE]
Current: []
]urrent: [ELECTRONICS
]urrent: [OUTSIDE GARDEN
]urrent: [INDOOR GARDEN
]urrent: [MILLWORK
]urrent: [LUMBER
]urrent: [APPLIANCES
]urrent: [HARDWARE
...
这是在使用上述任一行后打印 curr->title 时的输出。 我唯一做的另一件事是在我的主菜单中列出打印列表下方的其他功能菜单,但这是与填充链接列表中的节点相关的逻辑。
您的代码无效。
例如,函数 insertSortedList
(与函数 search
一样)会产生多个内存泄漏,而且还有未定义的行为。
这些内存分配
node = (node *) malloc(sizeof(node));
curr = (node *) malloc(sizeof(node));
没有意义。分配的内存未使用,将丢失。
结点head
一般可以等于NULL
。因此,访问例如空指针的数据成员 next
会调用未定义的行为。
除此之外,指向头节点的指针在函数内没有改变,因为它是通过引用传递给函数的。
我将展示如何编写函数。尝试自己更新其他功能。
int insertSortedList( node **head,
const char *title,
const char *category,
double time)
{
node *node = malloc( sizeof( node ) );
int success = node != NULL;
if ( success )
{
strcpy( node->title, title );
node->title[ strcspn( node->title, "\n" ) ] = '[=11=]';
strcpy( node->category, category );
node->category[ strcspn( node->category, "\n" ) ] = '[=11=]';
node->time = time;
while ( *head != NULL && !( strcmp( node->title, ( *head )->title ) < 0 ) )
{
head = &( *head )->next;
}
node->next = *head;
*head = node;
}
return success;
}
并且该函数至少可以像
那样调用insertSortedList(&head, title, category, time);
^^^^^
如果您使用的系统附加了从文件中读取的带有两个符号 '\r'
和 '\n'
的字符串,那么您可以使用以下调用 strcspn
node->title[ strcspn( node->title, "\r\n" ) ] = '[=13=]';