C-使用getchar()仅读取一个字符

问题描述 投票:0回答:3

我在使用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");
  }
}
c getchar
3个回答
1
投票

处理完第一个字符后,循环调用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();
  }
}

0
投票

您可以做这样的事情:

while (1) {
    movement = getchar();
    while(getchar() != '\n')
       getchar();
    switch (movement) {...}

循环将捕获所有字符,直到换行符(\n),因此将忽略所有其他字符。


0
投票

假设您只想读取一个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];
}
© www.soinside.com 2019 - 2024. All rights reserved.