Согласно MSDN, нет такой опции для nmake
.
можно однако заставить компилятор создать несколько файлов параллельно при помощи /MP
опция с VC ++ компилятор командной строки и передающий несколько файлов одновременно:
> cl /MP a.cpp b.cpp c.cpp
Однако примечание, что большинство Make-файлов не называет компилятор как это - они обычный, вызывает компилятор, отдельный для каждого отдельного исходного файла, который препятствовал бы /MP
опция делать что-либо полезное.
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.
[
Соответствует непустой последовательности символов из указанного набора допустимые символы;
(курсив мой).
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
Похоже, вы сейчас имеете дело со значениями CSV. Если вам нужно расширить его для обработки строк в кавычках (например, чтобы поля могли содержать запятые), вы обнаружите, что семейство scanf
не может справиться со всеми сложностями формата. Таким образом, вам нужно будет использовать код, специально разработанный для обработки (вашего варианта) CSV-формата.
Вы найдете обсуждение реализации набора CSV-библиотеки в ' The Practice of Programming ' - в C и C ++. Несомненно, есть много других доступных.
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 ()
.