#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char* getfield(char* line, int num) {
const char* tok;
for (tok = strtok(line, ",");
tok && *tok;
tok = strtok(NULL, ",\n"))
{
if (!--num)
return tok;
}
return NULL;
}
int main()
{
FILE* stream = fopen("b.csv", "r");
char line[1024];
char *pstr;int num;
const char* value;
while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
//printf("Field 3 would be %s\n", getfield(tmp, 3));
value=getfield(tmp, 3);
num =strtol(value,&pstr,10);
printf("Field 3 would be %d\n", num);
// NOTE strtok clobbers tmp
free(tmp);
}
}
/* b.csv
301,36,15
302,88,75
// мой вывод
Field 3 would be 15
Field 3 would be 75
*/
проблема: /* b.csv
301,36,15
302,88,
,,,34
если таблица повреждена, как указано выше, «strtok» возвращает NULL, и поэтому «strtol» дает «segfault».. как это решить?
Здесь основная проблема заключается в том, что если 2-й нет, он обрабатывает 3-й как второй и выдает segfault !! например, в 3-й строке b.csv ",,,34" означает, что присутствует 3-е значение, но оно ведет себя так, как будто "34" - это 1-е значение, а 2-е и третье соответственно NULL !!
strtol
по указателюNULL
? Это никогда не сработает. Проверяйте наличиеNULL
перед вызовом чего-либо с помощью этого указателя. - person Some programmer dude   schedule 30.10.2012