为什么 Utf8Char 的向量值正在发生变化

Why values of vector of Utf8Char is changing?

本文关键字:变化 Utf8Char 向量 为什么      更新时间:2023-10-16

我有一个CSVReader类,它有这个函数

vector<UtfChar*> CSVFile::ReadFile(FILE* fp)
{
    //int count = 0;
    Utf8Char buff[256];
    fgets(buff, 256, (FILE*)fp);
      //  count++;
    Utf8Char *token = strtok(buff, ",");
    bvector<UtfChar*> localVec;
    while (token != NULL)
    {
        localVec.push_back(token);
        token = strtok(NULL, ",");
    }
    return localVec;
}

现在我有另一个类,我从中调用这个函数:

FILE *fp;
fp = fopen("SampleFile.csv", "r");
while((getc(fp)) != EOF)
{
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp);  
}

在这里,我将localVec的值与我拥有的一些值(char*)进行比较。但是在另一个类中,当我尝试访问像 localVec[0] 或 l ocalVec[1] 这样的向量时,它会给出垃圾。我尝试在 CSVReader 类本身进行比较,然后它在那里工作。但是我需要在其他类中进行比较,以便我可以对其他CSV文件使用相同的CSVReader类。

这里的问题是你有悬空的指针。 创建并填充本地数组

Utf8Char buff[256];
fgets(buff, 256, (FILE*)fp);

然后,您可以使用以下命令获得指向该缓冲区不同段的指针

Utf8Char *token = strtok(buff, ",");
bvector<UtfChar*> localVec;
while (token != NULL)
{
    localVec.push_back(token);
    token = strtok(NULL, ",");
}

因此,现在您有一个充满指向本地缓冲区每个段的指针的向量。 从函数返回向量后,本地缓冲区将被销毁。 这意味着您现在拥有的所有指针都指向您不再拥有的内存。 使用这些指针是未定义的行为,也是获得垃圾输出的原因。

另请注意,如果您使用如何在C++中读取和解析 CSV 文件?来解析 CSV 文件,则可以避免所有这些 C-ism。

此代码

bvector<UtfChar*> localVec;

意味着您将指针存储在向量中。

这些指针指向一个局部变量,该变量在函数返回时超出范围。

看起来您跳过了从文件中读取的每个字符串中的第一个字符:

while((getc(fp)) != EOF){
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp);
}

是故意的吗?如果是,那么问题就在这里:UTF-8 字符可以具有可变长度(例如,有些用 1 字节表示,有些用 2 个字节表示,依此类推,最多 6 个字节)。如果不进行任何字符串转换,则可以将 UTF-8 字符串逐个字节从一个地方复制到另一个地方,而不必担心字符长度,因为字符串将保持有效。但是,如果您从字符串上切掉第一个字节,那么它就不再是有效的 UTF-8 字符串,并且不能像它一样解释。