已建立链表但无法正常工作
linked list built but not working properly
我在链表中有数字,我应该将其转换为 char* 和 return。
这是可能存在问题的函数。
char* int_str(struct Node** head,char* result) //head is pointer to singly linked list
{
struct Node* temp = *head;
char* string1="";
char* str;
while(temp != NULL)
{
string1=myitoa(temp->data,string1); // myitoa() works fine
str=(char*)malloc(1+strlen(string1));
strcpy(str,string1);
strcat(result,str);
temp=temp->next;
}
return result;
}
对 temp->data 的最后一次调用总是以未知的垃圾值结束。 (链接列表构建正确,因为打印链接列表工作正常。)
例子:链表是1->2->3
函数中对 temp->data 的最后一次调用给出了 50(一些垃圾值)
即1->2->50
而在主函数中,列表正确给出 1->2->3
最后一个变量在此函数中以垃圾结尾,但在主函数中正确显示,为什么?
char* string1;
这声明了一个指针,但没有为字符串分配缓冲区。将这个未初始化的指针传递给 myitoa
有点令人困惑,因为 myitoa
无法在不导致未定义行为的情况下对其执行任何操作。
这一行在 32 位系统上总是分配 5 个字节:
str=(char*)malloc(1+sizeof(string1));
sizeof(string1)
是 指针 的大小,而不是字符串的大小。使用
str=(char*)malloc(1+strlen(string1));
相反,或者更好的是,使用
str=malloc(1+strlen(string1));
因为the result of malloc should not be casted.
这段代码很可能会完成这项工作。不需要malloc。 str 定义为 20 个字符的数组。这是存储 ASCII 数字的地方。
char* int_str(struct Node** head,char* result) //head is pointer to singly linked list
{
struct Node* temp = *head;
char str[20];
while(temp != NULL)
{
strcat(result, myitoa(temp->data, str));
temp=temp->next;
}
return result;
}
我认为问题不在于字符串操作。很可能它与链表的创建有关。试试这个:
首先,尝试在循环中打印temp->data 的值。可能它应该是垃圾(在这种情况下列表创建包含问题)。如果打印值正确,则检查返回的 "result" 字符串是否包含相同的值。如果不是,那么问题出在 myitoa 函数中。
这里我假设 myitoa 正在为 string1 分配内存。(如果没有,那么你必须在将它传递给函数之前或在 myitoa.
我在链表中有数字,我应该将其转换为 char* 和 return。
这是可能存在问题的函数。
char* int_str(struct Node** head,char* result) //head is pointer to singly linked list
{
struct Node* temp = *head;
char* string1="";
char* str;
while(temp != NULL)
{
string1=myitoa(temp->data,string1); // myitoa() works fine
str=(char*)malloc(1+strlen(string1));
strcpy(str,string1);
strcat(result,str);
temp=temp->next;
}
return result;
}
对 temp->data 的最后一次调用总是以未知的垃圾值结束。 (链接列表构建正确,因为打印链接列表工作正常。)
例子:链表是1->2->3
函数中对 temp->data 的最后一次调用给出了 50(一些垃圾值) 即1->2->50
而在主函数中,列表正确给出 1->2->3
最后一个变量在此函数中以垃圾结尾,但在主函数中正确显示,为什么?
char* string1;
这声明了一个指针,但没有为字符串分配缓冲区。将这个未初始化的指针传递给 myitoa
有点令人困惑,因为 myitoa
无法在不导致未定义行为的情况下对其执行任何操作。
这一行在 32 位系统上总是分配 5 个字节:
str=(char*)malloc(1+sizeof(string1));
sizeof(string1)
是 指针 的大小,而不是字符串的大小。使用
str=(char*)malloc(1+strlen(string1));
相反,或者更好的是,使用
str=malloc(1+strlen(string1));
因为the result of malloc should not be casted.
这段代码很可能会完成这项工作。不需要malloc。 str 定义为 20 个字符的数组。这是存储 ASCII 数字的地方。
char* int_str(struct Node** head,char* result) //head is pointer to singly linked list
{
struct Node* temp = *head;
char str[20];
while(temp != NULL)
{
strcat(result, myitoa(temp->data, str));
temp=temp->next;
}
return result;
}
我认为问题不在于字符串操作。很可能它与链表的创建有关。试试这个:
首先,尝试在循环中打印temp->data 的值。可能它应该是垃圾(在这种情况下列表创建包含问题)。如果打印值正确,则检查返回的 "result" 字符串是否包含相同的值。如果不是,那么问题出在 myitoa 函数中。
这里我假设 myitoa 正在为 string1 分配内存。(如果没有,那么你必须在将它传递给函数之前或在 myitoa.