scanf ("...% n", ...) при неудачном сопоставлении - PullRequest
1 голос
/ 12 ноября 2011

Я хочу посчитать «столбцы» в файлах CSV, учитывая строковый шаблон его элементов, например,

   1,2,3,4 

с шаблоном "% d" должен вернуть 4.

Я написал токенизатор вот так

offset = 0;
strcpy(var_pattern, pattern) // e.g. pattern = "%d," 
strcat(var_pattern, "%n")
while (sscanf(&line[offset], LINE_SIZE, buf,var_pattern,&bytes_consumed > 0) {
      count++; // column counter
      offset += bytes_consumed
};

проблема, которую я имею, заключается в отсутствии разделителя, ',' в примере, для последнего элемента в строке файла CSV. На linux64 / gcc делаю

    c = sscanf("12","%d,%n",&a,&b)

дает c = 1 (количество совпавших шаблонов), a = 12 и b = 32767 (использованные байты). Является ли это (идиотское) поведение стандартом / платформой? Или ошибка?

Я знаю о strtok или упакованном регулярном выражении, но мне бы хотелось использовать стандартный метод, и идея использования strtok вызывает у моего внутреннего программиста рвоту.

ТИА

1 Ответ

0 голосов
/ 12 ноября 2011

Ваше решение сложно, проще:

char *s="1,2,3,4";
int n,i;
while( 1==sscanf(s,"%d%n",&i,&n) && (s+=n,*s==','?++s:!*s) )
  printf("%d\n",i);
...