字符串传染媒介在纯净的C的

时间:2017-08-01 12:36:01

标签: c arrays string vector

在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中创建字符串向量

3 个答案:

答案 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;
}