Потеря последнего символа в строке при чтении значения из строки в CSV - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь разобрать строку файла 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

И 1 для columnNumber

В результате возвращается:

beforeyoustartedgackinyouusedtohaveabrainbutnowyoudontgeteventhesimpliesofthingsdrawalittlepictureevenusemyhandstrytoexplainbutyoujustdontunderstando

1 Ответ

0 голосов
/ 16 ноября 2018

Вы никогда не копируете последний символ строки, потому что у вас i < strlen(lineBuffer) - 1 в условии цикла for.Измените это на i < strlen(lineBuffer).

Вам также необходимо сделать копию строки перед возвратом, вы не можете вернуть локальный массив в C:

return strdup(tempString);

Это также означает, чтовызывающая сторона должна освободить эту строку, когда она закончит с ней, поскольку strdup() выделяет память динамически.В качестве альтернативы, вы могли бы использовать malloc() для выделения tempArray() во-первых, вместо объявления локального массива.

...