Используя istringstream
, мы могли бы читать элементы один за другим из строки, например:
istringstream iss("1 2 3 4");
int tmp;
while (iss >> tmp) {
printf("%d \n", tmp); // output: 1 2 3 4
}
мы могли бы сделать это с помощью sscanf
?
Вы можете довольно точно имитировать это с помощью этого
const char *s = "1 2 3 4";
int tmp, cnt;
for (const char *p = s; sscanf(p, "%d%n", &tmp, &cnt) == 1; p += cnt)
printf("%d\n", tmp);
Если вы можете разбить строку на отдельные токены, используя strtok
char str[] ="1 2 3 4";
char * pch;
pch = strtok (str," ");
while (pch != NULL)
{
int tmp;
sscanf( pch, "%d", &tmp );
printf( "%d \n", tmp );
pch = strtok (NULL, " ");
}
В противном случае scanf поддерживает преобразование% n, которое позволит вам подсчитать количество потребляемых символов до сих пор (я не тестировал это, могут быть ошибки, которые я не рассматривал);
char str[] ="1 2 3 4";
int ofs = 0;
while ( ofs < strlen(str) )
{
int tmp, ofs2;
sscanf( &str[ofs], "%d %n", &tmp, &ofs2 );
printf( "%d \n", tmp );
ofs += ofs2;
}
%n
поsscanf
. Я бы сделал тест>= 1
вместо этого.%n
не увеличивает счет присваивания, возвращаемый при завершении выполнения функцииfscanf
».