C ++无法在char数组用于循环中打印字母模式

时间:2018-10-26 10:39:50

标签: c++ arrays

我的应用程序的工作是在从用户那里获取文本值之后,该应用程序以水平模式将其打印出来,但没有显示任何内容。

为使问题更简短,我仅输入了26种模式:

int main()
{

printf("Please inter a text:");
string input;
cin >> input;

char ptn[2][7][13] = {{
        {' ', ' ', ' ', ' ', ' ', ' ', 'A', ' ', ' ', ' ', ' ', ' ', ' '},
        {' ', ' ', ' ', ' ', ' ', 'A', ' ', 'A', ' ', ' ', ' ', ' ', ' '},
        {' ', ' ', ' ', ' ', 'A', ' ', ' ', ' ', 'A', ' ', ' ', ' ', ' '},
        {' ', ' ', ' ', 'A', 'A', 'A', 'A', 'A', 'A', 'A', ' ', ' ', ' '},
        {' ', ' ', 'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A', ' ', ' '},
        {' ', 'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A', ' '},
        {'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A'}},

        {{'B', 'B', 'B', 'B', ' ', ' ',' ', ' ', ' ', ' ', ' ', ' ', ' '},
        {' ', ' ', ' ', ' ', 'B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
        {'B', ' ', ' ', ' ', 'B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
        {'B', 'B', 'B', 'B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
        {'B', ' ', ' ', ' ', 'B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
        {' ', ' ', ' ', ' ', 'B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
        {'B', 'B', 'B', 'B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}}};

for (int y = 0; y < 7; y++) {
    for (int i = 0; input[i] != '\0'; i++) {
           cout << ptn[input[i]][y];
    }

    cout << "\n";
}
return 0;
}

输出应为:

      A       BBBB                                                                                                              
     A A      B   B                                                                                                             
    A   A     B   B                                                                                                             
   AAAAAAA    BBBB                                                                                                              
  A       A   B   B                                                                                                             
 A         A  B   B                                                                                                             
A           A BBBB 

3 个答案:

答案 0 :(得分:0)

首先,您尝试以一种行不通的方式来迭代std::string

for (int i = 0; input[i] != '\0'; i++)

使用no null-termination,此循环将疯狂运行。对照i检查input.size(),或简单地:

for (auto c : input)

The above may not be true.


第二,您的字符到索引的映射已关闭:如果我输入A,则ptn[input[i]]ptn['A'],而依次是ptn[0x41],这是超出ptn的范围。

一个A应该映射到索引0,一个B映射到1,依此类推。因此,要么做正确的“ ASCII数学”,要么使用除数组,例如std::map<std::vector<std::string> >和“手动”映射每个字符。


第三次,也许不是现在那么重要,您不检查输入是否仅包含ptn中的字母。

由于至少可以输入 这样的字母,因此您应该跳过它们,否则会因向用户显示某种错误消息而失败。

答案 1 :(得分:0)

  • ptn[2][7][13]很难理解。在子类型中破坏定义glyph_set由26个字形组成。 glyph由7行组成。 row由5列组成(为空终止符加1):

    enum
    {
      col_count = 5 + 1,
      row_count = 7,
      glyph_count = 26
    };

    typedef const char row_t[ col_count ];
    typedef const row_t glyph_t[ row_count ];
    typedef const glyph_t glyph_set_t[ glyph_count ];
  • 字形的由7行5列乘以构成该行的字符数组成。如果您的文字是"AB",则该行将由7行10列组成(在字母之间加一个空格)。

您的程序(demo

#include <iostream>
#include <string>
#include <cctype>

enum
{
  col_count = 5 + 1,
  row_count = 7,
  glyph_count = 26
};

typedef const char row_t[ col_count ];
typedef const row_t glyph_t[ row_count ];
typedef const glyph_t glyph_set_t[ glyph_count ];
typedef std::string line_t[ row_count ];

glyph_set_t gs
{
  {
    {"  A  "},
    {" A A "},
    {"A   A"},
    {"A   A"},
    {"AAAAA"},
    {"A   A"},
    {"A   A"},
  },

  {
    {"BBBB "},
    {"B   B"},
    {"B   B"},
    {"BBBB "},
    {"B   B"},
    {"B   B"},
    {"BBBB "},
  },
  //...
};


int main()
{
  const char* s = "AB";

  for( int r = 0; r < row_count; ++r )
  {
    for( const char* p = s; *p; ++p )
    {
      int set_idx = std::toupper( *p ) - 'A';
      // this...
      glyph_t& g = gs[ set_idx ];
      std::cout << g[ r ] << ' ';
      // ...or this (whichever is easier for you)
      // std::cout << gs[ set_idx ][ r ] << ' ';
    }
    std::cout << std::endl;
  }
  return 0;
}

答案 2 :(得分:0)

尝试将您的输入作为内部运算符[]传递。检查字母是否可以确保在您的情况下我们不会超出范围26。

int main()
{
    const int PATTERN_MAX_LENGHT = 7;
    const int PATTERN_MAX_HEIGHT = 13;
    const int MAX_PATTERNS = 1;

    const char pattern [MAX_PATTERNS][PATTERN_MAX_LENGHT][PATTERN_MAX_HEIGHT] = 
    {
        {
            {' ', ' ', ' ', ' ', ' ', ' ', 'A', ' ', ' ', ' ', ' ', ' ', ' '},
            {' ', ' ', ' ', ' ', ' ', 'A', ' ', 'A', ' ', ' ', ' ', ' ', ' '},
            {' ', ' ', ' ', ' ', 'A', ' ', ' ', ' ', 'A', ' ', ' ', ' ', ' '},
            {' ', ' ', ' ', 'A', 'A', 'A', 'A', 'A', 'A', 'A', ' ', ' ', ' '},
            {' ', ' ', 'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A', ' ', ' '},
            {' ', 'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A', ' '},
            {'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'A'}
        }
    };


    char chInput;

    cin>>chInput;
    if( ! isalpha ( chInput ) )
    {
        //Not an Alphabet
        return false;
    }
    chInput = tolower( chInput );

    int index = chInput - 'a';

    //Print in loop
    for(int i =0;i < PATTERN_MAX_LENGHT  ; i++ )
    {
        for(int j=0;j < PATTERN_MAX_HEIGHT ; j++)
        {
            cout<<pattern[index][i][j];
        }
        cout<<endl;
    }

    return 0;
}