C ++打印奇怪的字符

时间:2014-11-24 09:36:00

标签: c++

所以我在下面有这个程序,目前我运行后输出:

abcdefghijklmnopqrstuvwxyz
eklpyqrbgjdwtcaxzsnifvhmou
TEst
iyniЉhb�{���{���`�5b�v4b�q4b�{����8b�`�5b��`{���{����o���7�vb��{�����or��o���@`�lhb���5b��`x@ 

任何理由? 当前意味着随机化的行也不是随机的

#include <algorithm>
#include <array>
#include <iostream>
#include <numeric>
#include <fstream>
#include <string>

using namespace std;

int main()
{   
    char Text[256];
    array<char, 26> letters;
    iota(letters.begin(), letters.end(), 'a');
    for(char c: letters) //Array before shuffling
    {   
        cout << c;
    }
    cout << '\n';
    random_shuffle(letters.begin(), letters.end());
    for(char c: letters) //After shuffling
    {
        cout << c;
    }
    cout << '\n';
    cin.getline (Text,256);
    for (char & c : Text)
    {
        if (c == 'a' || c == 'A')
        {
            cout << letters[0];
        }
        else if (c == 'b' || c == 'B')
        {
             cout << letters[1];
        }
        else if (c == 'c' || c == 'C')
        {
             cout << letters[2];
        }
        else if (c == 'd' || c == 'D')
        {
             cout << letters[3];
        }
        else if (c == 'e' || c == 'E')
        {
             cout << letters[4];
        }
        else if (c == 'f' || c == 'F')
        {
             cout << letters[5];
        }
        else if (c == 'g' || c == 'G')
        {
             cout << letters[6];
        }
        else if (c == 'h' || c == 'H')
        {
             cout << letters[7];
        }
        else if (c == 'i' || c == 'I')
        {
             cout << letters[8];
        }
        else if (c == 'j' || c == 'J')
        {
             cout << letters[9];
        }
        else if (c == 'k' || c == 'K')
        {
             cout << letters[10];
        }
        else if (c == 'l' || c == 'L')
        {
             cout << letters[11];
        }
        else if (c == 'm' || c == 'M')
        {
             cout << letters[12];
        }
        else if (c == 'n' || c == 'N')
        {
            cout << letters[13];
        }
        else if (c == 'o' || c == 'O')
        {
            cout << letters[14];
        }
        else if (c == 'p' || c == 'P')
        {
            cout << letters[15];
        }
        else if (c == 'q' || c == 'Q')
        {
            cout << letters[16];
        }
        else if (c == 'r' || c == 'R')
        {
            cout << letters[17];
        }
        else if (c == 's' || c == 'S')
        {
            cout << letters[18];
        }
        else if (c == 't' || c == 'T')
        {
            cout << letters[19];
        }
        else if (c == 'u' || c == 'U')
        {
            cout << letters[20];
        }
        else if (c == 'v' || c == 'V')
        {
            cout << letters[21];
        }
        else if (c == 'w' || c == 'W')
        {
            cout << letters[22];
        }
        else if (c == 'x' || c == 'X')
        {
            cout << letters[23];
        }
        else if (c == 'y' || c == 'Y')
        {
            cout << letters[24];
        }
        else if (c == 'z' || c == 'Z')
        {
            cout << letters[25];
        }
        else if (c == ' ')
        {
            cout << ' ';
        }       
        else if (c == '/n')
        {
            return 0;
        }
        else 
        {
        cout << c;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

else if (c == '/n')
{
    return 0;
}

应该是

else if (c == '\n')
{
    return 0;
}

但是,如果您正在寻找输入的结尾,那么您实际上需要

else if (c == '\0')
{
    return 0;
}

哪个是空终止符,表示字符串的结尾。基本上你得到的是存储在整个256个字符数组中的所有垃圾。

但是,这对您的29 if else次陈述没有帮助。试试这个:

if(c == ' '){ // Space
    cout << ' ';
}
else if(c >= 'A' && c <= 'Z'){ // Uppercase
    cout << letters[c - 'A'];
}
else if(c >= 'a' && c <= 'z'){ // Lowercase
    cout << letters[c - 'a'];
}
else if(c == '\0'){ // End of string
    return 0;
}
else{ // Anything else
    cout << c;
}

工作原理:

计算机中没有“字母”,只有二进制文件。 “A”不存在,01000001 65A的{​​{1}}。因此,如果您输入“A”,您的程序将会看到65.但是,我恰好知道在您的letters数组中,您的A位置为0,因此{{1} }。相同的逻辑可用于B,C,D等。对于小写字母也是如此,它们只是在不同的范围内(97-122)。

答案 1 :(得分:0)

问题在这里

else if (c == '/n')   // '/n' is not correct

将其更改为

else if (c == '\0')   // Check EOF