在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.转换它。我正在考虑使用:
char **v;
但是,如何跟踪每个字符串的开头?我应该使用单独的数组来存储每个字符串在内存空间中的偏移量吗?
更一般地说,如何在C中创建字符串向量
答案 0 :(得分:4)
您采取的方法似乎足够合理。你有一个指向这里的指针。由于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]);
答案 1 :(得分:0)
tl; dr:http://eddmann.com/posts/implementing-a-dynamic-vector-array-in-c/
如何跟踪每个字符串的开头?
你不必担心。每个字符串由char *
表示,它实际上是指向每个字符串开头的指针。
我应该使用单独的数组来存储每个字符串在内存空间中的偏移量吗?
您提到了char **
。在实现向量时,此char **
将指向将存储char *
的内存空间。其中每个都是指向每个字符串开头的指针。所以,让我们想象你有一个char **myVector
并用一些字符串填充它(见下面的链接)。然后你可以像这样访问向量的第一个字符串:myVector[0]
。您可以通过执行myVector[0][0]
来访问向量的第一个字符串的第一个字符。
在C中查看this link的干净矢量实现。正如您将看到的,它只是指针,动态内存分配,重新分配和NULL
指针的问题。检查!
答案 2 :(得分:0)
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;
备注:您可以在向量中包含不同长度的字符串,但由于您可能会处理大量Segmentation fault
错误,因此这种情况会有很大的折旧。
一个好的做法是定义一个类型并将所有这些抛入函数
typedef char **string_vector;
string_vector initialize_vector (int vect_dim, int str_length) {
string_vector v;
/* same code as above */
return v;
}