#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番目を2番目として扱い、セグメンテーション違反を発生させることです。たとえば、b.csvの3行目にある ",,, 34"は、3番目の値が存在することを意味しますが、 "34"は1番目の値であり、2番目と3番目はそれぞれNULLであるように動作します。