C++ 为什么Utf8Char的向量值在变化?

C++ 为什么Utf8Char的向量值在变化?,c++,c++11,C++,C++11,我有一个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*> localVe

我有一个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;
}
向量CSVFile::ReadFile(FILE*fp) { //整数计数=0; Utf8Char buff[256]; fgets(buff,256,(文件*)fp); //计数++; Utf8Char*标记=strtok(buff,“,”); bvector localVec; while(令牌!=NULL) { localVec.push_back(令牌); 令牌=strtok(空,“”,“”); } 返回localVec; } 现在我有了另一个类,我从中调用这个函数:

FILE *fp;
fp = fopen("SampleFile.csv", "r");
while((getc(fp)) != EOF)
{
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp);  
}
文件*fp;
fp=fopen(“SampleFile.csv”,“r”);
while((getc(fp))!=EOF)
{
bvector 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, ",");
}
Utf8Char*token=strtok(buff,”,”;
bvector localVec;
while(令牌!=NULL)
{
localVec.push_back(令牌);
令牌=strtok(空,“”,“”);
}
现在你有了一个向量,它充满了指向本地缓冲区每一段的指针。从函数返回向量后,本地缓冲区将被销毁。这意味着您现在拥有的所有指针都指向不再拥有的内存。使用这些指针是未定义的行为,也是获取垃圾输出的原因


另外请注意,如果使用解析CSV文件,则可以避免所有这些C-ism。

这里的问题是指针悬空。您可以使用创建和填充本地数组

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, ",");
}
Utf8Char*token=strtok(buff,”,”;
bvector localVec;
while(令牌!=NULL)
{
localVec.push_back(令牌);
令牌=strtok(空,“”,“”);
}
现在你有了一个向量,它充满了指向本地缓冲区每一段的指针。从函数返回向量后,本地缓冲区将被销毁。这意味着您现在拥有的所有指针都指向不再拥有的内存。使用这些指针是未定义的行为,也是获取垃圾输出的原因

另请注意,如果使用解析CSV文件,则可以避免所有这些C-ism。

此代码

bvector<UtfChar*> localVec;
bvector localVec;
意味着您正在向量中存储指针

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

这段代码

bvector<UtfChar*> localVec;
bvector localVec;
意味着您正在向量中存储指针


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

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

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

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

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

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

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

指针和C函数。什么会出错?这是因为你使用的是一个缓冲区,所有向量元素都引用它,然后它就被销毁了。请使用C++标准库。它提供什么样的“垃圾”?UTF8CHAR是如何定义的?@逻辑元素,如果程序员不能了解局部变量的范围,以及如何处理简单指针,使用C++标准库将不起作用。什么是<代码> bVAVE/COD>?指针和C函数。什么会出错?这是因为你使用的是一个缓冲区,所有向量元素都引用它,然后它就被销毁了。请使用C++标准库。它提供什么样的“垃圾”?UTF8CHAR是如何定义的?@逻辑元素,如果程序员不能学习局部变量的范围,如何处理简单指针,使用C++标准库是没有帮助的。什么是<代码> bVATA/COD>?没有,不是故意的。如何避免。。谢谢你,这不是故意的。如何避免。。谢谢,顺便说一句