Строка переменной длины в массиве int? - PullRequest
0 голосов
/ 20 октября 2011

У меня есть строка в форме "1 2 8 4 9 0" и т. Д. Я знаю, что он будет следовать формату целого, пробела, целого числа ...

Однако я не могу гарантировать длину. Я знаю максимальную длину, если это поможет. Я думал использовать sscanf, но ему нужно конечное число целых чисел.

Любые идеи, как я могу превратить "1 2 3" в массив, где

A [0] = 1

A [1] = 2

A [2] = 3

Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

strtol указывает, где в строке произошел сбой.
Для такой строки, как "1 2 3 ...", будет прочитано 1 и произойдет сбой сразу после этого;если затем передать эту точку отказа (" 2 3 ...") на strtol, она будет читать 2 и сразу после этого произойдет сбой, ..., ...

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char input[] = "6 82 -7453 4 0 63 ";
  char *err = " ", *curr = input;
  int x, k = 0;
  while (*curr && isspace((unsigned char)*err)) {
    x = strtol(curr, &err, 10);
    printf("#%d: %d\n", k++, x);
    curr = err + !!*err; // do not advance past the '\0'
  }
  return 0;
}

См.он в действии - в отличие от приведенного выше фрагмента, идеальный инициализирует k с 1: / и плохо обрабатывает входные данные, заканчивающиеся пробелами.

1 голос
/ 20 октября 2011

Используйте

rc = sscanf(string, "%d%n", &array[i], &len);

В цикле.Проверьте rc и используйте len, чтобы перейти к следующему пункту.

0 голосов
/ 20 октября 2011

Одним из многих способов может быть использование strtok для токенизации строки с разделителем в качестве пробела, а возвращаемое значение каждого вызова strtok можно использовать с sscanf для одного целого числа,Поскольку вы знаете максимальную длину, вы можете перебрать массив для использования с sscanf что-то на этих строках .
Надеюсь, это поможет!

0 голосов
/ 20 октября 2011

Это действительно не так сложно:

  1. Рассчитать длину строки с помощью strlen
  2. Выделите достаточно памяти для массива с malloc
  3. Перебрать строку еще раз и заполнить массив

увидеть его в действии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...