我正在尝试解析一行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
你永远不会复制该行的最后一个字符,因为你在i < strlen(lineBuffer) - 1
循环条件中有for
。改为i < strlen(lineBuffer)
。
你还需要在返回之前复制字符串,你不能在C中返回一个本地数组:
return strdup(tempString);
这也意味着调用者需要在完成后释放该字符串,因为strdup()
会动态分配内存。或者,你可以使用malloc()
来首先分配tempArray()
,而不是声明一个本地数组。