我的程序编译,没关系。当我启动它并键入“AB”时,它们出现在一行上,但是当我键入“BAAB”时,“AB”出现在“BA”下。我被困在这里很长一段时间了。如果你为这个问题提供解决方案,我将非常感激。
//它需要从键盘读取输入并显示由星号构成的每个字母
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
char line[100] = { 'A', 'B' };
int i;
int row;
int col;
bool A[7][6] = { {0, 0, 1, 0, 0, 0}, //letter A
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 1, 1, 1, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0} };
bool B[7][6] = { {1, 1, 1, 0, 0, 0}, //letter B
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 1, 1, 1, 0, 0},
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 1, 1, 1, 0, 0} };
int main () {
//reads the input
printf ("Type a word or number, or both: ");
scanf ("%s", line);
// loop for every row of every letter
for (row = 0; row < 7; row++)
{
// loop for every inputed letter
for (i = 0; line[i]; i++)
{
// if letter is A do this...
if (line[i] == 'A')
{
// lopp for every column to read the asterisks
for (col = 0; col < 5; col++) {
if (A[row][col])
printf ("*");
else
printf (" ");
}
printf ("\n");
}
if (line[i] == 'B') {
for (col = 0; col < 5; col++) {
if (B[row][col])
printf ("*");
else
printf (" ");
}
}
}
}
return (0);
}
答案 0 :(得分:1)
Trex,您首先需要了解的是“如果我没有输入,我的代码会怎么做?”。请注释掉您的初始printf
和scanf
并检查:
//reads the input
// printf ("Type a word or number, or both: ");
// scanf ("%s", line);
输出:
$ ./bin/multi_array_mess
*
*** * *
* * * *
* * *****
**** * *
* ** *
* ** *
****
line
的哪些值会产生输出? {'A', 'B'}
如果line
包含AB
以外的任何内容,会发生什么?试试'A'
:
$ Type a word or number, or both: A
*
* *
* *
*****
* *
* *
* *
然后使用'B'
:
$ ./bin/multi_array_mess
Type a word or number, or both: B
*** * * * * **** * ** *****
很明显,在打印newline
的循环中某处遗漏了B
。更改逻辑以匹配打印'A'
的方式,类似于:
if (line[i] == 'B') {
for (col = 0; col < 5; col++) {
if (B[row][col])
printf ("*");
else
printf (" ");
}
printf ("\n");
}
如果只输入'B'
以响应提示,则提供所需的输出:
$ ./bin/multi_array_mess
Type a word or number, or both: B
***
* *
* *
****
* *
* *
****
如果您输入'A'
或'B'
以外的任何内容,会打印什么?没有。如果同时输入'A'
和'B'
会怎样? (你搞得一团糟)。
所以它看起来只是修补你的程序,它被设计为打印A
B
'*'
0
使用1
作为字符取决于line
的值或数组中的'A'
。您可以修复逻辑以处理包含'B'
和line
的{{1}},也可以一次将输入限制为一个字符。
由于您的意图似乎能够一次处理// loop for every inputed letter
for (i = 0; line[i]; i++)
{
// loop for every row of every letter
for (row = 0; row < 7; row++)
{
// if letter is A do this...
if (line[i] == 'A')
{
中的多个字符,如果我们稍微调整一下循环逻辑会发生什么。 E.g:
printf ("Type a word or number, or both: ");
试一试......
接下来,考虑一下如何提示输入:
printf ("Please enter A or B, or both: ");
将您的请求限制为代码将为其提供输出的内容会不会更有意义吗?
for (i = 0; i < (int)strlen (line); i++)
if (line[i] != 'A' || line[i] != 'B') {
fprintf (stderr, "error: invalid input '%c'.\n", line[i]);
return 1;
}
收到输入后,在盲目地将输入传递给程序的其余部分之前检查用户提供的内容是否更有意义?简单的事情会做:
'*'
现在再试一次你的程序。
在一行打印每封信
行。现在我知道你的意图了,它让你更容易提供帮助。为了在同一行上将每个数组打印为' '
或line
,您基本上必须遍历每一行,检查allowed
中是否指定了给定的字母并打印该行你需要打印的每个角色。您可以通过创建一个函数来减少代码重复,以便为每个数组打印行(您实际上可以使用宏,但我们将在以后保留它)。
与前面的讨论一致,我添加了一些健全性检查并创建了一个新的字符数组main
,其中包含您为(允许的字符)创建数组的当前字符列表。只需在添加数组时添加即可。您还会注意到我已将所有全局变量移到#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAXL 100
#define ROWS 7
#define COLS 5
void prn_letter_row (bool a[][COLS+1], size_t row);
int main (void) {
char line[MAXL] = {0};
char allowed[] = "AB";
size_t i, row, len;
i = row = len = 0;
bool A[ROWS][COLS+1] = {{0, 0, 1, 0, 0, 0}, //letter A
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 1, 1, 1, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0}};
bool B[ROWS][COLS+1] = {{1, 1, 1, 0, 0, 0}, //letter B
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 1, 1, 1, 0, 0},
{1, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 1, 0},
{1, 1, 1, 1, 0, 0}};
/* prompt for input */
while (!*line)
{
printf ("\nType a word or number, or both [A-B only]: ");
if (!fgets (line, MAXL, stdin))
fprintf (stderr, "error: no input provided - 'ctrl+d'.\n");
len = strlen (line); /* get length, remove trailing \n */
if (line[len-1] == '\n')
line[--len] = 0;
char *p = line;
while (*p) { /* check each character against 'allowed' */
if (!strchr (allowed, *p)) {
fprintf (stderr, "error: invalid character '%c'.\n", *p);
*line = 0;
}
p++;
}
}
printf ("valid: %s\n\n", line);
for (row = 0; row < ROWS; row++) {
for (i = 0; i < len; i++) {
switch (line[i]) {
case 'A' : prn_letter_row (A, row);
break;
case 'B' : prn_letter_row (B, row);
break;
}
}
putchar ('\n');
}
return 0;
}
/* print given row for letter */
void prn_letter_row (bool a[][COLS+1], size_t row)
{
size_t i;
putchar (' '); /* provide a space before each letter */
for (i = 0; i < COLS; i++)
if (a[row][i])
putchar ('*');
else
putchar (' ');
}
中。使用全局变量没有任何问题,但只在必要时使用它们。
将各个部分组合在一起,您可以执行以下操作:
$ ./bin/chars_from_arrays
Type a word or number, or both [A-B only]: A
valid: A
*
* *
* *
*****
* *
* *
* *
$ ./bin/chars_from_arrays
Type a word or number, or both [A-B only]: B
valid: B
***
* *
* *
****
* *
* *
****
$ ./bin/chars_from_arrays
Type a word or number, or both [A-B only]: AB
valid: AB
* ***
* * * *
* * * *
***** ****
* * * *
* * * *
* * ****
使用/输出强>
class Pet(object):
def __init__(self):
self.name = ''
self.age = 0
def getName(self, newname):
self.name = newname
return self.name
def getAge(self):
return self.age
def setAge(self, newage):
self.age = newage
return None
polly = Pet()
polly.setAge(100)
print (polly.getAge())
答案 1 :(得分:0)
这是您的固定代码
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
char line[100] = {'A','B'};
int i;
int row;
int col;
// Support only latin aphabet, easly expandable
bool chars[26][7][6] = {
{ {0,0,1,0,0,0 }, //letter A
{1,0,0,0,1,0 },
{1,0,0,0,1,0 },
{1,1,1,1,1,0 },
{1,0,0,0,1,0 },
{1,0,0,0,1,0 },
{1,0,0,0,1,0 }},
{ {1,1,1,0,0,0 }, //letter B
{1,0,0,1,0,0 },
{1,0,0,1,0,0 },
{1,1,1,1,0,0 },
{1,0,0,0,1,0 },
{1,0,0,0,1,0 },
{1,1,1,1,0,0 }},
// to Z
};
int main()
{
printf ("Type a word or number, or both: ");
scanf ("%s",line);
//reads the input
for (row = 0;row<7;row++)
// loop for every row of every letter
{
for (i = 0; line[i]; i++) //loop for every inputed letter
{
for (col = 0;col < 6;col++) // lopp for every column to read the asterisks
{
if (chars[toupper(line[i]) - 'A'][row][col])
{
printf("*");
}
else
printf(" ");
}
}
printf("\n");
}
return (0);
}
您可以通过形成像
这样的3d数组来添加多个角色支持bool chars[26][7][6] = {
{ {0,0,1,0,0,0 }, //letter A
{1,0,0,0,1,0 },
{1,0,0,0,1,0 },
{1,1,1,1,1,0 },
{1,0,0,0,1,0 },
{1,0,0,0,1,0 },
{1,0,0,0,1,0 }},
{ {1,1,1,0,0,0 }, //letter B
{1,0,0,1,0,0 },
{1,0,0,1,0,0 },
{1,1,1,1,0,0 },
{1,0,0,0,1,0 },
{1,0,0,0,1,0 },
{1,1,1,1,0,0 }},
// to Z
};
访问数组成员
chars[toupper(line[i]) - 'A'][row][col];
在这种情况下,您不能仅使用任何字符if
检查for
循环
这只适用于小字符串大小,因为标准控制台最多支持80个字符,为了处理它你可以设置控制台宽度,或者使用控制台游标执行一些操作来正确地打破形成的字符串(如SetConsoleCursorPosition)在Windows中。
如果你想支持所有可打印的字符,你的3d数组应该以最多128个字符的空格字符开头。有关更多信息,请查看ASCII字符表。