C ++ странный вывод, преобразовывающий строку в int - PullRequest
1 голос
/ 26 сентября 2010

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

int get_val()
    {
        int sum =0;
        for(int num_bits = size; num_bits>0; num_bits--)
        {
            printf("String sub %i is %i\n", num_bits, int(bin[num_bits]));
        }
    }

Когда я ввожу строку из 16 нулей, я получаю следующий вывод:

String sub 16 is 24
String sub 15 is 0
String sub 14 is 0
String sub 13 is 0
String sub 12 is 23
String sub 11 is 0
String sub 10 is 0
String sub 9 is 0
String sub 8 is 22
String sub 7 is 0
String sub 6 is 0
String sub 5 is 0
String sub 4 is 21
String sub 3 is 0
String sub 2 is 0
String sub 1 is 0

Зачем мне ставить на получение разных значений, если я введу все нули?

РЕДАКТИРОВАТЬ: корзина "0000000000000000"

Ответы [ 2 ]

1 голос
/ 26 сентября 2010

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

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

using namespace std;

int main() {
    string bin = "000111010";
    int size = bin.length();
    int sum = 0;
    for(int num_bits = 1; num_bits <= size; num_bits++) {
      sum <<= 1;
      sum += bin[num_bits - 1] - '0';
    }
    printf("Binary string %s converted to integer is: %i\n", bin.c_str(), sum);
}

Как уже говорилось в комментариях, основной трюк здесь заключается в преобразовании символов ASCII '0' и '1' в целые числа 0 и 1, что осуществляется путем вычитания значения '0'. Кроме того, я изменил порядок перемещения строки, потому что таким образом вы можете сдвигать целое число после каждого бита и всегда устанавливать значение самого младшего на данный момент бита.

0 голосов
/ 26 сентября 2010

Короткий ответ, вы бы не стали.

Длинный ответ, есть несколько проблем с этим. Первая большая проблема заключается в том, что если мы предположим, что bin - это стандартный массив символов длины "size", то ваша первая печать недействительна. Индекс массива отключен на 1. Рассмотрим пример кода:

int size = 16;
char * bin = new char[size];

for(int i=0; i<size; i++)
{
    bin[i] = 0;
}

for(int num_bits = size; num_bits>0; num_bits--)
{
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits]));
}

Который производит:

String sub 16 is -3
String sub 15 is 0
String sub 14 is 0
String sub 13 is 0
String sub 12 is 0
String sub 11 is 0
String sub 10 is 0
String sub 9 is 0
String sub 8 is 0
String sub 7 is 0
String sub 6 is 0
String sub 5 is 0
String sub 4 is 0
String sub 3 is 0
String sub 2 is 0
String sub 1 is 0

Судя по полученному вами результату, я думаю, вы сделали что-то вроде:

int size=16;
int * ints = new int[size];
char * bin;

//Fill with numbers, not zeros, based on the evidence
for(int i=0; i<size; i++)
{
    ints[i] = 20 + i;
}

//Copy over to character buffer
bin = (char*)(void*)&(ints[0]);

for(int num_bits = size; num_bits>0; num_bits--)
{
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits]));
}

Это объясняет, что вы видели отлично. Итак, я думаю, что ваше предположение о том, что bin указывает на массив нулей символов, неверно. Есть несколько действительно больших проблем с этим, при условии, что вы сделали что-то подобное.

  1. Ваше предположение о том, что вся память равна нулю, неверно, и вам нужно объяснить это или опубликовать реальный код, и мы сделаем
  2. Вы не можете просто рассматривать буфер целых чисел как символы - строка состоит из однобайтовых символов (обычно), целые числа составляют 4 байта, обычно
  3. Массивы в C ++ начинаются с 0, а не с 1
  4. Преобразование символа в целое число [int ('0')] не приводит к интеллектуальному преобразованию - полученное целое число - это десятичное 48, а не десятичное 0 (есть функция atoi, которая будет делать это, так как а также другие лучшие или другое предложение использовать вычитание)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...