Почему моя строка получает пустые значения, добавленные к ней при вычитании символов? - PullRequest
0 голосов
/ 09 ноября 2010

Я пытаюсь решить проблему с topcoder.com, и это сводит меня с ума.Я изучаю C ++ после долгого перерыва в C и испытываю проблемы со строками.

Цель программы - декодировать строку из 0 и 1, которая прошла алгоритм шифрования, состоящий из добавления каждого смежногоцифра к рассматриваемой цифре.

Таким образом, 010111 становится 112232 (LSB и MSB считаются с нулями рядом с ними).Ниже приведен мой алгоритм декодирования строки:

#include <string>
#include <vector>
#include <iostream>

using namespace std;

class BinaryCode {
public:
    vector<string> decode(string message);
};

vector<string> BinaryCode::decode(string message) {
    vector<string> decoded(2);
    int i;

    string myTempString;
    myTempString.append("0");
    myTempString.append(1,message[0] - myTempString[0]);
    for(i=2; i<message.size(); i++) {
        myTempString.append(1,message[i-1] - myTempString[i-1] - myTempString[i-2]);
    }

    decoded[0] = myTempString;

    myTempString = "";
    myTempString.append("1");
    myTempString.append(1,message[0] - myTempString[0]);
    for(i=2; i<message.size(); i++) {
        myTempString.append(1, message[i-1] - myTempString[i-1] - myTempString[i-2]);
    }

    decoded[1] = myTempString;

    return decoded;
}

int main () {
    string message("123210122");
    BinaryCode *code = new BinaryCode;
    vector<string> result = code->decode(message);
    cout << "Decoded strings are "+result[0]+" and "+result[1];
    getchar();
    return 0;
}

Вывод бессмысленный:

Декодированные строки: 01

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

Это всего лишь предположение, поскольку вы не показываете, какой вывод вы получаете, но похоже, что вы выполняете математические вычисления для значений символов и в конечном итоге получаете символы в диапазоне управления. Например, «1» - «0» - это , а не «1» (символ 49), это 1 или Control-A. Это не для печати и, как правило, будет невидимым в выводе. Аналогично, «1» + «2» - это 49 + 50 или 99, что означает «с». C ++ не собирается магически преобразовывать эти символы в целые числа для вас. Надеемся, что это даст вам информацию, необходимую для исправления вашего кода.

1 голос
/ 09 ноября 2010

Символ является 8-битным целым типом. Он имеет специальное свойство, которое при печати будет отображаться как символ, соответствующий значению ASCII, которое он содержит.

Например:

int valueAsInt = 65;
char valueAsChar = valueAsInt;
std::cout << valueAsChar << "\n";

valueAsInt = 'A';
std::cout << valueAsInt << "\n";

A
65

Примите значение символьного литерала '0'. Это соответствует значению ASCII 48. «1» равно 49 и т. Д.

Если вы вычтите 48 из 49, вы получите 1. Но это не то, что вы ищете.

Значение ASCII 1 соответствует непечатному символу, называемому «начало заголовка». Когда-то он использовался на старых принтерах в качестве разметки. Он не печатает, но изменяет способ печати дальнейших символов.

Когда вы вычитаете один числовой символ из другого, вы получаете дельту, а не печатный символ. Чтобы превратить эту дельту обратно в печатный символ, вы должны добавить его к базовому символу:

char value = '5' - '3';
value += '0';
std::cout << "5 - 3 = " << value << "\n";

5 - 3 = 2

Итак, ваш код, такой как message[0] - myTempString[0], должен быть изменен на message[0] - myTempString[0] + '0', чтобы работать так, как вы намереваетесь.

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