Вот возможное решение с использованием strtok()
.Он может обрабатывать произвольное количество столбцов (при необходимости увеличьте размер buf
) и будет работать, если порядок столбцов будет изменен на обратный (т. Е. c1
> c2
).Функция возвращает 1
в случае успеха (токены успешно объединены), 0
в противном случае.
Обратите внимание, что strtok()
изменяет свой аргумент - поэтому я скопировал input
во временный буфер char buf[64]
.
/*
* Merge space-separated 'tokens' in a string.
* Columns are zero-indexed.
*
* Return: 1 on success, 0 on failure
*/
int merge_cols(char *input, int c1, int c2, char *dest) {
char buf[64];
int col = 0;
char *tok = NULL, *first = NULL, *second = NULL, *tmp = NULL;
if (c1 == c2) {
fprintf(stderr, "Columns can not be the same !");
return 0;
}
if (strlen(input) > sizeof(buf) - 1) return 0;
/*
* strtok() is _destructive_, so copy the input to
* a buffer.
*/
strcpy(buf, input);
tok = strtok(buf, " ");
while (tok) {
if (col == c1 || col == c2) {
if (!first)
first = tok;
else if (first && !second)
second = tok;
}
if (first && second) break;
tok = strtok(NULL, " ");
col++;
}
// In case order of columns is swapped ...
if (c1 > c2) {
tmp = second;
second = first;
first = tmp;
}
if (first) strcpy(dest, first);
if (second) strcat(dest, second);
return first && second;
}
Пример использования:
char *input = "one two three four five six seven eight";
char dest[128];
// The columns can be reversed ...
int merged = merge_cols(input, 7, 1, dest);
if (merged)
puts(dest);
Также обратите внимание, что при использовании strtok()
очень легко использовать разные разделители - так что если вы хотите использовать разделенные запятыми или табуляциейввод вместо пробелов, вы просто меняете второй аргумент при его вызове.