如何将字符串传递给链表而不是C中的字符数组?

如何将字符串传递给链表而不是C中的字符数组?,c,string,linked-list,C,String,Linked List,我知道C中没有字符串数据类型。我想做的是从用户那里获取一个输入字符串并将其存储到变量中,而不必定义它需要多少字符。我可以用链表吗?我希望尽可能避免将其放入字符数组中,因此我只能想到链表,但我不知道如何操作。可以在链表中执行此操作,但字符链表通常是一种效率极低的数据结构-每个节点都有一个字符和至少一个指针。在一个典型的例子中,指针需要4或8个字节,字符需要1个字节,因此会带来很大的开销 我的直接建议是在链接列表的每个节点中至少放置16个字符,以保持开销至少合理。当然,动态数组通常会更好,但至少可以

我知道C中没有字符串数据类型。我想做的是从用户那里获取一个输入字符串并将其存储到变量中,而不必定义它需要多少字符。我可以用链表吗?我希望尽可能避免将其放入字符数组中,因此我只能想到链表,但我不知道如何操作。

可以在链表中执行此操作,但字符链表通常是一种效率极低的数据结构-每个节点都有一个字符和至少一个指针。在一个典型的例子中,指针需要4或8个字节,字符需要1个字节,因此会带来很大的开销

我的直接建议是在链接列表的每个节点中至少放置16个字符,以保持开销至少合理。当然,动态数组通常会更好,但至少可以避免链表变得完全不合理。

您可以在链表中这样做,但字符链表通常是一种效率极低的数据结构-每个节点都有一个字符和至少一个指针。在一个典型的例子中,指针需要4或8个字节,字符需要1个字节,因此会带来很大的开销


我的直接建议是在链接列表的每个节点中至少放置16个字符,以保持开销至少合理。当然,动态数组通常会更好,但至少这样可以避免链表变得完全不合理。

您可以使用链表,但更常见的方法是使用malloc分配内存块,如果用户输入超出数组的边界,则使用realloc动态调整该块的大小

void*mallocsize\u t size; malloc函数分配内存的大小字节,并返回指向已分配内存的指针

void*reallocvoid*ptr,大小; realloc函数尝试将ptr指向的分配的大小更改为size,并且 返回ptr。如果没有足够的空间来扩大ptr所指的内存分配,则realloc 创建一个新的分配,复制ptr指向的尽可能多的旧数据以适应新的分配,释放旧的分配,并返回一个指向已分配内存的指针。如果ptr为NULL,则realloc与对malloc的大小字节调用相同。如果大小为零且ptr不为空,则分配一个新的最小大小的对象,并释放原始对象


您可以使用链表,但更常见的方法是使用malloc分配内存块,并在用户输入超出数组边界时使用realloc动态调整该块的大小

void*mallocsize\u t size; malloc函数分配内存的大小字节,并返回指向已分配内存的指针

void*reallocvoid*ptr,大小; realloc函数尝试将ptr指向的分配的大小更改为size,并且 返回ptr。如果没有足够的空间来扩大ptr所指的内存分配,则realloc 创建一个新的分配,复制ptr指向的尽可能多的旧数据以适应新的分配,释放旧的分配,并返回一个指向已分配内存的指针。如果ptr为NULL,则realloc与对malloc的大小字节调用相同。如果大小为零且ptr不为空,则分配一个新的最小大小的对象,并释放原始对象


我很确定你是用一个字符指针来完成的

char* storedString;

void storeString(char* inputString)
{
  char* s = storedString; // temporary handler
  while(++s = ++inputString); // copy string
}

int main(int argc, char** argv)
{
  storeString("hello");
  // you can now treat storedString as if it was an array of chars
  // containing: 'h'+'e'+'l'+'l'+'o'+'\0'
}

我很确定你是用一个字符指针来完成的

char* storedString;

void storeString(char* inputString)
{
  char* s = storedString; // temporary handler
  while(++s = ++inputString); // copy string
}

int main(int argc, char** argv)
{
  storeString("hello");
  // you can now treat storedString as if it was an array of chars
  // containing: 'h'+'e'+'l'+'l'+'o'+'\0'
}
你可以:

计算所需字符串的长度,例如,计算字符数直到看到换行符,然后使用malloc分配动态数组,这需要两次传递输入字符串,或者 如果无法预先计算一个数组的长度,那么可以malloc一个固定数量的数组,从用户处读取,如果分配的大小不够大,则realloc。这需要一个n-pass,其中n是生成的realloc的数量。 你可以:

计算所需字符串的长度,例如,计算字符数直到看到换行符,然后使用malloc分配动态数组,这需要两次传递输入字符串,或者 如果无法预先计算一个数组的长度,那么可以malloc一个固定数量的数组,从用户处读取,如果分配的大小不够大,则realloc。这需要一个n-pass,其中n是生成的realloc的数量。
您可以动态创建一个字符数组。这比链表的大小和多功能性要好。为什么要避免使用字符数组?这是我作业中的一个要求。哦,我忘了给这个贴上家庭作业的标签了。让我再次编辑这个问题。你可以动态创建一个字符数组。那总比一辆汽车好
链表的大小和多功能性。为什么要避免使用字符数组?这是我作业中的一个要求。哦,我忘了给这个贴上家庭作业的标签了。让我再次编辑这个问题。如果程序员提前知道他/她需要的文本,这可能会起作用,但是关于这个代码,我不喜欢其他一些东西。其中最小的是一个全局变量和一个看似无限的粗略while循环。编辑:您运行过此代码吗?您从未为storedString分配内存,因此storedString只是指向单个字符的指针,而不是指向字符数组的指针。这将导致您写入一个您不应该能够写入的内存地址;并且可能会导致分段错误或随机数据损坏。@Lie:稍有错误,storedString是空指针,因为全局变量是零初始化的。如果程序员提前知道他/她需要的文本,这可能会起作用,但关于这段代码,我不喜欢其他一些东西。其中最小的是一个全局变量和一个看似无限的粗略while循环。编辑:您运行过此代码吗?您从未为storedString分配内存,因此storedString只是指向单个字符的指针,而不是指向字符数组的指针。这将导致您写入一个您不应该能够写入的内存地址;并且可能导致分段错误或随机数据损坏。@Lie:稍有错误,storedString是空指针,因为全局变量初始化为零。