【发布时间】:2020-01-23 17:04:47
【问题描述】:
我在使用 getchar() 时遇到了一些问题,特别是我有一个 char,它在 while 循环中获取从 getchar() 返回的值,但我只想获取第一个 char,如果我插入一个更长的字符串(如“aaawssdawa”),我仍然只想要第一个字符。相反,我的代码会处理整个字符串。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define ROWS 20
#define COLUMNS 65
char grid[ROWS][COLUMNS];
int score = 0;
void fillGridInitializer();
void printGrid();
void start();
void printScore();
void printAll();
int main(int argc, char *argv[]) {
start();
return 0;
}
void start() {
char movement;
int riga = 0, colonna = 0;
fillGridInitializer();
grid[riga][colonna] = '#';
system("clear");
printAll();
while (1) {
movement = getchar();
switch (movement) {
case 'w':
if ((riga - 1) >= 0) {
grid[riga][colonna] = '-';
riga = riga - 1;
}
break;
case 's':
if ((riga + 1) < ROWS) {
grid[riga][colonna] = '-';
riga = riga + 1;
}
break;
case 'a':
if ((colonna - 1) >= 0) {
grid[riga][colonna] = '-';
colonna = (colonna - 1) % COLUMNS;
}
break;
case 'd':
if ((colonna + 1) < COLUMNS) {
grid[riga][colonna] = '-';
colonna = (colonna + 1) % COLUMNS;
}
break;
default:
break;
}
if (movement == 'p') {
printf("+++++Game Over+++++\n\n");
break;
}
system("clear");
grid[riga][colonna] = '#';
printAll();
}
}
void printAll() {
printScore();
printGrid();
}
void fillGridInitializer() {
int i = 0, j = 0;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLUMNS; j++) {
grid[i][j] = '-';
}
}
}
void printScore() { printf("\t SCORE: %d\n", score); }
void printGrid() {
int i = 0, j = 0;
for (i = 0; i < ROWS; i++) {
printf("\t");
for (j = 0; j < COLUMNS; j++) {
printf("%c", grid[i][j]);
}
printf("\n");
}
}
【问题讨论】:
-
读完一个字符后,需要忽略所有字符,直到下一个换行符。
-
OT:关于;
int main(int argc, char *argv[]) {由于没有使用参数,编译器会输出两条关于未使用参数的警告信息。要消除这些警告消息,建议使用main()I.E 的其他有效签名。int main( void ) -
OT:为了便于阅读和理解 1) 用 2 或 3 个空行分隔函数(保持一致) 2) 分隔代码块:
forifelsewhile@987654329 @switchcasedefault通过一个空行。 3) 一致地缩进代码。在每个左大括号“{”后缩进。在每个右大括号 '}' 之前取消缩进。建议每个缩进级别为 4 个空格。 4) 遵循公理:每行只有一个语句,并且(最多)每条语句有一个变量声明。 -
OT:关于:
void fillGridInitializer(); void printGrid(); void start(); void printScore(); void printAll();和类似的原型语句,如果函数不带参数,则在原型中在括号内包含void,类似于:void fillGridInitializer( void ); void printGrid( void ); void start( void ); void printScore( void ); void printAll( void );否则编译器将为函数生成代码以获取任意数量的参数,而不仅仅是没有参数