C++ 无法在字符数组中使用 for 循环打印字母模式

C++ can't print alphabet pattern in char array use for loop

本文关键字:循环 for 打印 模式 字符 数组 C++      更新时间:2023-10-16

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

为了使问题更短,我只放置 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] != ''; 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 
  • 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 列组成(加上字母之间的空格(。

您的程序(演示(

#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;
}

首先,您尝试以一种不起作用的方式迭代std::string
for (int i = 0; input[i] != ''; i++)

如果没有空终止,此循环将疯狂运行。要么检查iinput.size(),要么简单地:
for (auto c : input)

以上可能不是真的。


其次,你的字符到索引映射是关闭的:如果我输入一个A,那么ptn[input[i]]ptn['A'],而ptn[0x41]又是,这超出了ptn的范围。

一个A应该映射到索引0,一个B映射到1,等等。因此,要么做正确的"ASCII数学",要么使用数组以外的其他东西,例如std::map<std::vector<std::string> >和"手动"映射每个字符。


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

由于至少可以输入此类字母,因此您应该跳过它们或失败,并向用户显示某种错误消息。

尝试将输入作为内部运算符[]传递。检查是字母表可以确保我们不会在您的情况下超出范围 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;
}