Чтобы включить пробелы в отсканированных строках, лучшим выбором может быть спецификатор %n
, чтобы зафиксировать количество символов, обработанных при сканировании."%s %n
запишет количество символов, обработанных первым словом и конечным пробелом.%*d%n
будет сканировать и отбрасывать целое число и записывать общее количество символов, обработанных до конца целого числа.Затем %s%n
пропустит пробел, отсканирует последнее слово и запишет общее количество обработанных символов.
Используйте strncpy
, чтобы скопировать слово и пробел.
#include <stdio.h>
#include <string.h>
#define SIZE 19
//so SIZE can be part of sscanf Format String
#define FS_(x) #x
#define FS(x) FS_(x)
int main ( void) {
char s[SIZE + 1] = "test1 16 test2";
char a[SIZE + 1]; char b[SIZE + 1];
int before = 0;
int after = 0;
int stop = 0;
if ( 2 == sscanf(s, "%"FS(SIZE)"s %n%*d%n%"FS(SIZE)"s%n", a, &before, &after, b, &stop)) {
if ( before <= SIZE) {
strncpy ( a, s, before);//copy before number of characters
a[before] = 0;//terminate
}
if ( stop - after <= SIZE) {
strncpy ( b, &s[after], stop - after);//from index after, copy stop-after characters
b[stop - after] = 0;//terminate
}
printf("'%s' '%s'\n", a, b);
}
return 0;
}