我的应用程序的工作是在从用户那里获取文本值之后,该应用程序以水平模式将其打印出来,但没有显示任何内容。
为使问题更简短,我仅输入了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
答案 0 :(得分:0)
首先,您尝试以一种行不通的方式来迭代 std::string
:
for (int i = 0; input[i] != '\0'; i++)
使用no null-termination,此循环将疯狂运行。对照 i
检查input.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
中的字母。
由于至少可以输入 这样的字母,因此您应该跳过它们,否则会因向用户显示某种错误消息而失败。
答案 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 ];
"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;
}