纯C语言中的字符串向量 在C++中,我将如何填充字符串向量,每个字符串的长度可以从1到65536,并遍历: std::vector<std::string> v; std::string s = "Hello1"; v.push_back(s); std::string s2 = "ALongerHello2"; v.push_back(s2); for (int i = 0; i < v.size(); i++) cout << v[i];

纯C语言中的字符串向量 在C++中,我将如何填充字符串向量,每个字符串的长度可以从1到65536,并遍历: std::vector<std::string> v; std::string s = "Hello1"; v.push_back(s); std::string s2 = "ALongerHello2"; v.push_back(s2); for (int i = 0; i < v.size(); i++) cout << v[i];,c,arrays,string,vector,C,Arrays,String,Vector,但是,我如何跟踪每个字符串的开头呢?我应该使用单独的数组来存储内存空间中每个字符串的偏移量吗 更一般地说,如何在C中创建字符串向量?您所采取的方法似乎足够合理。这里有一个指向指针的指针。不需要跟踪每个字符串的开头,因为v正是用于此目的。v[0]指向第一个字符串,v[1]指向第二个字符串,以此类推 上面的示例可以如下所示: char** v = (char**)malloc(sizeof(char*)*2); v[0] = malloc(sizeof(char)*7); strcpy(v[0],

但是,我如何跟踪每个字符串的开头呢?我应该使用单独的数组来存储内存空间中每个字符串的偏移量吗


更一般地说,如何在C中创建字符串向量?

您所采取的方法似乎足够合理。这里有一个指向指针的指针。不需要跟踪每个字符串的开头,因为v正是用于此目的。v[0]指向第一个字符串,v[1]指向第二个字符串,以此类推

上面的示例可以如下所示:

char** v = (char**)malloc(sizeof(char*)*2);
v[0] = malloc(sizeof(char)*7);
strcpy(v[0], "Hello1");
v[1] = malloc(sizeof(char)*14);
strcpy(v[1], "ALongerHello2");
for (int i = 0; i < 2; i++)
    printf("%s", v[i]);
tl;博士:

如何跟踪每个字符串的开头

你不必为此担心。每个字符串都由char*表示,char*实际上是指向每个字符串开头的指针

我应该使用单独的数组来存储内存空间中每个字符串的偏移量吗

你提到了一个字符**。在实现向量时,此字符**将指向存储字符*的内存空间。每个字符串都是指向每个字符串开头的指针。让我们假设您有一个char**myVector,并用一些字符串填充它,请参见下面的链接。然后可以访问向量的第一个字符串,如:myVector[0]。您可以通过执行myVector[0][0]来访问向量的第一个字符串的第一个字符


看看C中的干净向量实现。正如您将看到的,这只是指针、动态内存分配、重新分配和空指针检查的问题

C不是字符串或向量的最佳语言。然而,对于这个问题有很多解决方案。您的想法很好,但您需要使用malloc为向量分配内存

char** v;
int vect_dim = some_value; // the number of strings in your vector (its dimension)
int str_length = some_other_value ; // the number of characters in your string

v = malloc(sizeof(char*) * vect_dim);

v[0] = malloc(sizeof(char*) * str_length * vect_dim)
for (int i=0; i<vect_dim; i++)
    v[i] = v[0] + i*str_length;

每个字符串的开头是什么意思?这就是C字符串的char*所指的。你已经有了。你能澄清你的帖子吗?@StoryTeller我会尝试重新措辞,或者我会先读答案,它可能会回答。谢谢。最后一件事:当必须添加第三个字符串时,我应该怎么做?reallocv,sizeofchar**3;或者类似的事情?@Basj是的,那将是一种解决方法。但是如果你期望你会增加很多,分配一个更大的尺寸是值得的,并且只有当你在v中的空间用完时才重新分配。好的,我会用*2模式或*1.5模式。如果2个数组已满,则分配4,然后分配8、16、32等以避免过多的realloc。你认为语法是reallocv,sizeofchar**3;对吗?@Basj听起来不错。虽然您可能需要将v强制转换为void*vAn数组,但其语法应该是char arrarr[2][3]。字符**v是指向指针的指针。这样做是有益的,因为指向指针的指针也有查找表以外的其他用途,并且数组的真实数组是连续的,其中查找表不是。char**不是char*的数组,它是指向char*的指针,我确信有一种方法可以使用非固定长度,我需要它,因为我不想为每个小字符串浪费65536,也不想出现分段错误。有一种方法,不是我使用的for循环,而是为每个v[I]指定不同的长度,我说可能有错误,但如果你足够小心,你可以避免它们。
char** v;
int vect_dim = some_value; // the number of strings in your vector (its dimension)
int str_length = some_other_value ; // the number of characters in your string

v = malloc(sizeof(char*) * vect_dim);

v[0] = malloc(sizeof(char*) * str_length * vect_dim)
for (int i=0; i<vect_dim; i++)
    v[i] = v[0] + i*str_length;
typedef char **string_vector;
string_vector initialize_vector (int vect_dim, int str_length) {
    string_vector v;
    /* same code as above */
    return v;
}