Функция, которая вставляет пробел для каждого N-го символа в строке, работает не так, как я думаю? - PullRequest
1 голос
/ 11 июля 2020

Для ясности: я знаю, что есть решения для реального кода, которые дают результат, который я ищу, но меня это не беспокоит. Меня беспокоит, почему код, который я уже написал , не дает желаемого результата.

Я написал эту функцию:

string ToBinary(int val, int space)
{
    string str = "";
    int tmp = int(val), num = 0;
    for (int i = INT_SIZE; i > 0; i--)
    {
        str = char((int(tmp & 1) + '0')) + str;
        tmp >>= 1;
    }
  for (int i = 1; i < str.size(); i++)
  {
    if (i % space == 0)
    {
      str.insert((i-num)," "); // num -starting at 0- is the number of spaces in the string
      num++;
    }
  }
    return str;
}

Итак, эта функция Предполагается, что он принимает целое число и преобразует его в двоичную строку, затем он берет эту строку и выполняет итерацию по каждому di git, вставляя пробел в каждый интервал space. (в данном случае это 4) Я называю это так: printf("%s", ToBinary(0,4).c_str()); (0 - первый элемент массива, содержащего целые числа).

Первый элемент - это номер 0, поэтому на выходе должен быть 0000 0000 0000 0000 0000 0000 0000 0000, но вместо этого 0000 00 00 00 00 00 00 00 00 00 0000000000, и я не уверен, почему?

Изменить: я считаю, что исправил код следующим образом:

string ToBinary(int val, int space)
{
    string str = "";
    int tmp = int(val);
    for (int i = INT_SIZE; i > 0; i--)
    {
        str = char((int(tmp & 1) + '0')) + str;
        tmp >>= 1;
        if (i % space == 0)
        {
            str.insert(i-(i-1)," ");
        }
    }
    return str;
}

Я покончил с второй для l oop полностью, и вместо этого решил изменить str внутри первого l oop. Я не совсем уверен, почему это дает желаемый результат, хотя в отличие от первого экземпляра опубликованного кода, поэтому, если кто-то знает, мне бы хотелось получить ответ!

1 Ответ

1 голос
/ 11 июля 2020

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

for (int i = 1; i + num < str.size(); i++)
{
    if (i % space == 0)
    {
        str.insert((i+num)," "); // num -starting at 0- is the number of spaces in the string
        num++;
    }
}

Хотя это несколько хитрый код. Я не уверен, что доверяю этому.

...