Дополнительные числа добавляются в строку, не знаете почему? - PullRequest
0 голосов
/ 18 сентября 2010
Number(string binary)
        {
            int raw_string_int[size];
            char raw_string_char[size];
            strcpy(raw_string_char,binary.c_str());
            printf("Raw String is %s",raw_string_char);

                for (int i=0;i<size;i++)
                {

                    raw_string_int[i] = int(raw_string_char[i]);
                    printf("%i\n",int(raw_string_char[i]));
                    if (raw_string_int[i] != 0 || raw_string_int[i] != 1)
                    {
                        printf("ERROR NOT A BINARY NUMBER\n");
                        exit(0);
                    }
                }

Привет, я ввожу 0001 как двоичный файл в командной строке, но к raw_string_char добавляются два дополнительных числа. Может кто-нибудь объяснить мне, почему это? Возврат каретки в качестве символа?

Вот что я получаю в командной строке:

./test
0001
Raw String is 000148
ERROR NOT A BINARY NUMBER

Ответы [ 5 ]

9 голосов
/ 18 сентября 2010

Вы забыли "\ n" в своем первом printf. 48 - от второго printf, и является результатом приведения первого '0' (ASCII 0x30 = 48) к int.

Чтобы преобразовать текстовое значение 0 или 1 в соответствующее целое число, необходимо вычесть 0x30.

2 голосов
/ 18 сентября 2010

Ваше предположение, что char('0') == int(0) и char('1') == int(1) просто не верны.В ASCII эти символы имеют значения 48 и 49.

То, что вы должны сделать, чтобы получить целочисленные значения цифровых символов, это субстрат '0' вместо простого приведения (raw_string_int[x] = raw_string_char[x] - '0';).

Я думаю, что у вас есть концептуальные проблемы, хотя.Массив не может быть заполнен допустимыми значениями до конца (соответствующая C-строка по крайней мере будет содержать нулевой терминатор, который не является допустимым двоичным символом).Вы можете использовать метод строки size(), чтобы узнать, сколько символов содержит строка.Естественно, вы рискуете переполнить буфер, если строка binary содержит size символов или более.

Если вы хотите проверить, является ли ввод действительным двоичным числом, почему вы не можете проверить исходную строку, зачем копировать данные в еще два массива?

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

Вы печатаете каждый символ в raw_string_char. Строки в стиле C идут до первого нулевого символа (это '\0', а не 0).

Изменить на for (int i = 0; raw_string_char[i] != 0 && i < size; i++).

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

Как и другие говорили, «0» преобразуется в целое число 48. На самом деле вам не нужно преобразовывать строку C ++ в строку стиля C. Вы можете использовать итераторы или оператор индекса [] в строке C ++. Вам также нужно использовать логическое AND && вместо логического OR || в вашем заявлении if.

#include<cstdio>
#include<string>

void Number(std::string binary) {
    for(std::string::const_iterator i = binary.begin(); i != binary.end(); i++ )
        if( *i != '0' && *i != '1')
        {
        printf("ERROR NOT A BINARY NUMBER\n");
            return;
        }
}

int main() {
    Number("0001");
}
0 голосов
/ 18 сентября 2010

raw_string_char никогда не инициализируется, возможно, это связано с дополнительными символами. Используйте memset для инициализации массива.

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