从CSV中的行读取值时丢失字符串中的最后一个字符

问题描述 投票:-1回答:1

我正在尝试解析一行CSV文件并提取出我想要的值。但是,我的功能是切断字符串中的最后一个字符,我无法弄清楚原因。我认为它与我分配空终止符的位置有关,但改变它没有帮助。任何帮助,将不胜感激。谢谢!

char* findKey(char lineBuffer[], int columnNumber ){
    char tempArray[strlen(lineBuffer)+2];
    int commasCounted = 0;
    int i =0;

    for(i = 0; i < strlen(lineBuffer) - 1; i++){
        if (commasCounted == columnNumber){
            commasCounted = i;
            break;
        }

        if (lineBuffer[i] == '\"'){
            i++;
            while(lineBuffer[i] && lineBuffer[i] != '\"'){
                i++;
            }
        }

        if (lineBuffer[i] == ','){
            commasCounted++;
        }
    }

    if(lineBuffer[commasCounted] == ','){
        tempArray[0] = '0';
        tempArray[1] = '0';
        tempArray[2] = '0';
        tempArray[3] = '0';
        tempArray[4] = '\0';
    }else{
        int j = 0;
        for(i = commasCounted; i < strlen(lineBuffer) - 1; i++){
            if(lineBuffer[i] == '\"'){
                i++;
                while(lineBuffer[i] && lineBuffer[i] != '\"'){
                    tempArray[j] = lineBuffer[i];
                    i++;
                    j++;
                }
                break;
            }else if(lineBuffer[i] == ','){
                break;
            }else
                tempArray[j] = lineBuffer[i];
                j++;
        }
        tempArray[j] = '\0';
    }

    char* tempString = strtok(tempArray, "\n");
    //printf("tempString before returning in findKey: %s\n", tempString); //testing
    return tempString;
}

CSV文件可以将某些列包装在引号中,这就是为什么在那里有一些引号检查的原因。这将传递要检查的字符串以及保存信息的列。所以,例如:传递给lineBuffer:

30,beforeyoustartedgackinyouusedtohaveabrainbutnowyoudontgeteventhesimpliesofthingsdrawalittlepictureevenusemyhandstrytoexplainbutyoujustdontunderstandoh

而对于columnNumber则为1

返回的结果如下:

beforeyoustartedgackinyouusedtohaveabrainbutnowyoudontgeteventhesimpliesofthingsdrawalittlepictureevenusemyhandstrytoexplainbutyoujustdontunderstando
c arrays string char
1个回答
3
投票

你永远不会复制该行的最后一个字符,因为你在i < strlen(lineBuffer) - 1循环条件中有for。改为i < strlen(lineBuffer)

你还需要在返回之前复制字符串,你不能在C中返回一个本地数组:

return strdup(tempString);

这也意味着调用者需要在完成后释放该字符串,因为strdup()会动态分配内存。或者,你可以使用malloc()来首先分配tempArray(),而不是声明一个本地数组。

© www.soinside.com 2019 - 2024. All rights reserved.