То, как я анализирую поля в запятой, разделило строку с помощью sscanf при поддержке пустых полей?

Согласно MSDN, нет такой опции для nmake.

можно однако заставить компилятор создать несколько файлов параллельно при помощи /MP опция с VC ++ компилятор командной строки и передающий несколько файлов одновременно:

> cl /MP a.cpp b.cpp c.cpp

Однако примечание, что большинство Make-файлов не называет компилятор как это - они обычный, вызывает компилятор, отдельный для каждого отдельного исходного файла, который препятствовал бы /MP опция делать что-либо полезное.

11
задан Jonathan Leffler 2 October 2009 в 13:20
поделиться

5 ответов

If you use strtok with the comma as your separator character you'll get a list of strings one or more of which will be null/zero length.

Have a look at my answer here for more information.

9
ответ дан 3 December 2019 в 08:56
поделиться

человек sscanf :

[ Соответствует непустой последовательности символов из указанного набора допустимые символы;

(курсив мой).

5
ответ дан 3 December 2019 в 08:56
поделиться

Here is my version to scan comma separated int values. The code detect empty and non-integer fields.

#include <stdio.h> 
#include <string.h> 

int main(){
  char str[] = " 1 , 2 x, , 4 ";
  printf("str: '%s'\n", str );

  for( char *s2 = str; s2; ){
    while( *s2 == ' ' || *s2 == '\t' ) s2++;
    char *s1 = strsep( &s2, "," );
    if( !*s1 ){
      printf("val: (empty)\n" );
    }
    else{
      int val;
      char ch;
      int ret = sscanf( s1, " %i %c", &val, &ch );
      if( ret != 1 ){
        printf("val: (syntax error)\n" );
      }
      else{
        printf("val: %i\n", val );
      }
    }
  }

  return 0;
}

Result:

str: ' 1 , 2 x, , 4 '
val: 1
val: (syntax error)
val: (empty)
val: 4
0
ответ дан 3 December 2019 в 08:56
поделиться

Похоже, вы сейчас имеете дело со значениями CSV. Если вам нужно расширить его для обработки строк в кавычках (например, чтобы поля могли содержать запятые), вы обнаружите, что семейство scanf не может справиться со всеми сложностями формата. Таким образом, вам нужно будет использовать код, специально разработанный для обработки (вашего варианта) CSV-формата.

Вы найдете обсуждение реализации набора CSV-библиотеки в ' The Practice of Programming ' - в C и C ++. Несомненно, есть много других доступных.

0
ответ дан 3 December 2019 в 08:56
поделиться

scanf () возвращает количество назначенных элементов. Может, тебе пригодится эта информация ...

char *data = "1, 2,,, 5, 6";
int a[6];
int assigned = sscanf(data, "%d,%d,%d,%d,%d,%d", a, a+1, a+2, a+3, a+4, a+5);
if (assigned < 6) {
    char fmt[18];
    switch (assigned) {
        default: assert(0 && "this did not happen"); break;
        case 0: fmt = ",%d,%d,%d,%d,%d"; break;
        case 1: fmt = "%d,,%d,%d,%d,%d"; break;
        case 2: fmt = "%d,%d,,%d,%d,%d"; break;
        case 3: fmt = "%d,%d,%d,,%d,%d"; break;
        case 4: fmt = "%d,%d,%d,%d,,%d"; break;
        case 5: fmt = "%d,%d,%d,%d,%d,"; break;
    }
    sscanf(data, fmt, a+(assigned<=0), a+1+(assigned<=1), a+2+(assigned<=2),
                      a+3+(assigned<=3), a+4+(assigned<=4));
}

Ух! И это только для 1 пропущенного значения
Как было указано в других ответах, вам гораздо лучше разобрать строку «обычным» способом: fgets () и strtok () .

-1
ответ дан 3 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: