我在使用getchar()时遇到了一些麻烦,特别是我有一个char,它在while循环中获取了getchar()返回的值,但是我只想获取第一个char,如果我插入一个更长的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");
}
}
处理完第一个字符后,循环调用getchar()
,直到获得换行符或EOF。
[另外,getchar()
返回int
,应相应地声明变量,以便可以与EOF
正确比较。
void start() {
int movement;
int riga = 0, colonna = 0;
fillGridInitializer();
grid[riga][colonna] = '#';
system("clear");
printAll();
while (1) {
movement = getchar();
if (movement == EOF) {
break;
}
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;
}
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {} # ignore the rest of the line
if (ch == EOF) {
break;
}
system("clear");
grid[riga][colonna] = '#';
printAll();
}
}
您可以做这样的事情:
while (1) {
movement = getchar();
while(getchar() != '\n')
getchar();
switch (movement) {...}
循环将捕获所有字符,直到换行符(\n
),因此将忽略所有其他字符。
假设您只想读取一个char并丢弃同一行中的所有其他内容,则可以执行以下操作:
只读一行,仅保存第一个字符。
但是,您不应该使用它,因为它容易受到缓冲区溢出的影响(请阅读其后的内容)。
char read(){
char buf[BUF_SIZE];
gets(buf);
return buf[0];
}
但是由于缓冲区可能溢出,所以不应该使用gets
。>
为了防止这种情况,您可以使用fgets
(请参阅this):
char read(){ char buf[BUF_SIZE]; fgets(buf,BUF_SIZE,stdin); return buf[0]; }
[在两种情况下,
BUF_SIZE
都是一个常量,用于定义字符串的最大长度。第二个示例是缓冲区溢出保护的,但是仅当行在缓冲区结束之前结束时才起作用。您可以多次拨打fgets
来绕过此问题:
char read(){ char buf[BUF_SIZE]; do{ fgets(buf, BUF_SIZE,stdin); }while(buf[strlen(buf)]!='\n'); return buf[0]; }
注意,最后一种方法需要
<string.h>
。
集成到您的代码中,将是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define ROWS 20
#define COLUMNS 65
#define BUF_SIZE 255
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 = read();
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");
}
}
char read(){
char buf[BUF_SIZE];
do{
fgets(buf, BUF_SIZE,stdin);
}while(buf[strlen(buf)]!='\n');
return buf[0];
}