为什么我的字符串在减去字符时会附加空值?

时间:2010-11-09 02:46:46

标签: c++ string char

我正试图解决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 个答案:

答案 0 :(得分:4)

这只是一个猜测,因为你没有显示你得到的输出,但看起来你正在对字符值进行数学运算并最终得到控制范围内的字符。例如,'1' - '0'是'1'(字符49),它是1,或者是Control-A。这不可打印,通常在输出中不可见。类似地,'1'+'2'是49 + 50或99,即'c'。 C ++不会将这些字符神奇地转换为整数。希望这能为您提供修复代码所需的信息。

答案 1 :(得分:1)

字符是8位整数类型。它具有特殊属性,在打印时,它将显示为与其包含的ASCII值匹配的字符。

例如:

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

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

一个   
65

取字符文字'0'的值。这对应于ASCII值48.'1'是49,等等。

如果你从49减去48,你会得到1.但这不是你想要的。

ASCII值1对应于不可打印的字符,称为“标题的开头”。它曾经在旧打印机上用作一种标记。它不会打印,但它会修改更多字符的打印方式。

从另一个数字字符中减去一个数字字符时,会得到一个delta,而不是一个可打印的字符。要将此delta变回可打印字符,您必须将其添加到基本字符:

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

5 - 3 = 2

因此,您的代码(例如message[0] - myTempString[0])必须更改为message[0] - myTempString[0] + '0'才能按照您的预期方式运作。