C++ 在字符数组中存储和恢复一组字

C++ 在字符数组中存储和恢复一组字,c++,string,C++,String,我有一个包含一些单词的单词向量 std::vector<std::string> words; 我应该如何逐字获取字符串?我发现这行有一个问题: features_ptr += strlen(features) + 1; 我猜你是说 features_ptr += strlen(features_ptr) + 1; 正如其他人所说,strcat可能也不能完全满足您的需要。C字符数组被视为空\0之前的字符串。如果在字符串中使用\0,则该字符串将仅在该空值处终止。所以“\0”就像

我有一个包含一些单词的单词向量

std::vector<std::string> words; 

我应该如何逐字获取字符串?

我发现这行有一个问题:

features_ptr += strlen(features) + 1;
我猜你是说

features_ptr += strlen(features_ptr) + 1;

正如其他人所说,strcat可能也不能完全满足您的需要。

C字符数组被视为空
\0
之前的字符串。如果在字符串中使用
\0
,则该字符串将仅在该空值处终止。所以
“\0”
就像一个空字符串一样好


您的问题是字符串数组的标准序列化和反序列化。您可以使用字符串中不存在的其他字符,例如
~
,而不是使用
\0
作为分隔符。但是,如果没有此类字符可用,则需要在序列化的字符串中附加更多信息,以帮助以后进行反序列化。其中一种方法如图所示。

std::strcat
不会添加
\0
分隔符,因为它在c字符串上操作,并且
\0
被视为空字符串,因此您的
功能将是从所有单词拼接在一起的一个字符串。如果将其视为
char
s的数组,则可以插入
\0
。不清楚你想要达到什么目标,不管是什么目标,看起来都不是正确的方式,但为了练习:

#include <iostream>
#include <vector>
#include <string>
#include <cstring>

int main()
{
    char features[20];
    std::vector<std::string> words = { "123","456","789" };

    int i = 0;
    for (size_t n = 0; n < words.size(); ++n)
    {
        for (size_t m = 0; m < words[n].size(); ++m)
            features[i++] = words[n][m];
        features[i++] = 0;
    }
    features[i] = 0; //<-- extra terminating null

    char *features_ptr = features;
    while (*features_ptr)
    {
        std::cout << features_ptr << std::endl;
        features_ptr += std::strlen(features_ptr) + 1;
    }
}

请注意此方法的一个重要细节,附加的
特性[i]=0for
循环之后,在拼接字符串的末尾添加第二个终止null
\0
。如果希望
while(*features_ptr)
循环在字符串末尾停止,则这一点非常重要。

std::strcat(features,“\0”)strcat不能以这种方式工作。不能使用STRCAT或其他STR*C函数来操作带有嵌入的0.字符串。如果您在C++中编程,则宁愿使用<代码> STD::String < /C>而不是字符数组。当使用
std::string
@skeller时,您不需要使用
str*()
函数。cplusplus.com没有提到
strtok
的注意事项列表。小心推荐。OP没有提到
C++11
tag。当用C++11或更高版本给出答案时,如果你在答案中提到同样的内容,那就好了。很多新OP都不知道如何编译C++11代码。最好提及标记,如<代码> -STD= C++ 11 @ BADOLA。标签描述非常清楚地使用了“使用这个标签来解决关于C++编译器编译的代码的问题。使用与特定标准修订有关的问题的特定版本标记[C++ 11 ]、[C++ 17 ]等。OP没有关于特定C++11功能的特定问题,因此他们没有使用它。您使用了
for(auto-const&word:words){…}
。如果不提供C++11或更高版本的编译标志,语法将无法编译。这只是建设性的批评。
features_ptr += strlen(features_ptr) + 1;
#include <iostream>
#include <vector>
#include <string>
#include <cstring>

int main()
{
    char features[20];
    std::vector<std::string> words = { "123","456","789" };

    int i = 0;
    for (size_t n = 0; n < words.size(); ++n)
    {
        for (size_t m = 0; m < words[n].size(); ++m)
            features[i++] = words[n][m];
        features[i++] = 0;
    }
    features[i] = 0; //<-- extra terminating null

    char *features_ptr = features;
    while (*features_ptr)
    {
        std::cout << features_ptr << std::endl;
        features_ptr += std::strlen(features_ptr) + 1;
    }
}
123
456
789