Как не игнорировать пробелы, которые предшествуют аргументам конструктора?

#c

#c

Вопрос:

Я пытаюсь создать конструктор для разреженного массива, который принимал бы N аргументов. Если перед аргументом стоят пробелы, то это сдвигает его индекс на одну позицию. По крайней мере, я так себе это представляю

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

 SparseArray<float,  3 > array0(1.0f, 2.0f);
SparseArray<double, 10> array1(      4.0,    7.0);
 

Массивы после инициализации должны быть такими
array0[0] == 1.0f , array0[1] == 2.0f .
И array1[1] == 4.0 array1[3] == 7.0 получается, как если бы пробелы занимали позиции 0 и 2 в array1 .

Комментарии:

1. Пробелы в основном игнорируются синтаксическим анализатором C . Вы не можете изменить синтаксис языка, если не напишете свой собственный препроцессор, который редактирует исходный код до того, как его увидит компилятор.

2. Также 1) это крайне сбивает с толку. Никто, кто читает код, не поймет этого поведения. Большинство программ форматирования кода удаляют эти пробелы. 2) почему вы сдвигаетесь на единицу? Что делать, если вы хотите пропустить 5 пунктов?

3. Пробелы игнорируются лексическим анализатором C , за исключением случаев, когда они помогают разграничивать токены. Одно пространство имеет точно такое же значение, как и миллион из них. Вы абсолютно ничего не можете с этим поделать.

4. спасибо за ответы.

5. Другие способы решения подобных проблем включают использование контрольного «значения» (объекта, который вы передаете), что означает «пустой элемент здесь». Или вариант или тот, в котором вы передаете объект с информацией о позиции (которая затем может быть произвольно большой) и значением для добавления в эту позицию.

Ответ №1:

То, что вы пытаетесь сделать, невозможно, поскольку у вас нет никакого контроля над синтаксическим анализатором C , и, честно говоря, не имеет смысла для тех, кто будет использовать ваш код.

Если вы не напишете какой-то препроцессор (просто не делайте этого), лучший вариант здесь — просто добавлять нули везде, где это необходимо:

 SparseArray<double, 10> array1( 0, 4.0, 0, 7.0);
 

Если вы все еще хотите использовать пробелы, альтернативой является использование string в качестве аргумента, а затем его самостоятельный анализ, извлечение чисел и поиск пробелов:

 SparseArray<double, 10> array1("   4.0,   7.0");
 

Я бы выбрал первый вариант.