替换line,c ++中的特定字符

时间:2012-01-30 21:04:00

标签: c++ replace char character

我正在开发一个用某个密钥解密文本的程序。我正在尝试使用replace()但它似乎没有用。例如,qwert应解密为hello,但输出为hlllo;在这种情况下,w中的qwert会被解密为e,但会重新解密为l

输入:

 xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj
 should come out as:
 the quick brown fox jumps over the lazy dog
 I'm getting:
 oga yaacd brozn aox gamav ovar oga lazy dog

我该如何解决这个问题?

int main()
{
    // ...
    myFile.open("decrypt.txt");
    while (myFile.good()) 
    {
        getline(myFile, line2);
        // now line2 is, e.g., "xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj"

        // help here
        for (int i = 0; i < 26; i++) 
        {
            replace(line2.begin(), line2.end(), key[i], fox[i]);
        }
        v.push_back(line2);
    }

    myFile.close();

    for (int i = 0; i < numline; i++) 
    {
        cout << "line " << i <<" = " << v[i] << endl;
    }

    return 0;
}

3 个答案:

答案 0 :(得分:2)

通过进行26次单独的替换,后者将踩到早期的替换结果。您需要找到一种方法,使每个替换每个字符只发生一次。

答案 1 :(得分:1)

您需要解密每个角色一次。您可以考虑在输入字符及其解密版本之间构建map,而不是有两个数组keyfox,其中(显然)包含要替换的字符。然后你可以简单地遍历输入字符串,一次解密一个字符。

std::map<char, char> lookup; 
// populate lookup such that lookup['q'] = 'h', lookup['w'] = 'e', etc.

// walk over line2, decrypting a character at a time.
for (int i = 0; i < line2.length(); i++)
{
    char c = line2[i];
    char d = lookup[c];
    line2[i] = d;
    // or, if you want to keep it on one line:
    // line2[i] = lookup[line2[i]];
}

答案 2 :(得分:-1)

在C ++中,您可以使用方括号访问和修改字符串元素。例如:

String str("dog");
str[1] = 'c';
//str = "dcg"

因此,您可以使用此表示法而不是replace()。如果替换不能按照您的意图工作,那么您的密钥可能就错了。