c - C 中的 Char 矩阵 - 使用 Scanf 或 getchar

标签 c

我在矩阵上输入信息时遇到了一些问题

我想构建一个简单的单词搜索游戏。用户将矩阵的维度告诉单词搜索并输入字符,我想打印它只是为了看看信息是否一切正常。

这是我的代码:

void main (){
int nl, nc, i,j;

scanf ("%d %d", &nl,&nc); //Input number of lines and collums of the matrix

char matrix [nl] [nc];

for (i=0;i<nl;i++)
    for (j=0;j<nc;j++)
            scanf("%c",&matrix[i][j]);   //Input matrix

printf("This is your matrix:\n");
for (i = 0; i < nl; i++)
    for (j = 0; j < nc; j++)
       printf("%c", matrix [i][j]);
}

如果我输入类似的内容

2 3
ABC
DEF

输出应该是:

This is your Matrix:
ABC
DEF

但是我打印时的输出类似于

This is your Matrix:

ABC
D

它首先给出一个“\n”,然后打印但不完整。

我做错了什么?请考虑到我应该只使用 scanf 和 getchar 等函数来构建矩阵。

最佳答案

OP:“我做错了什么?”
答: scanf("%c", .. 正在读取上一个 scanf ("%d%d"... 要避免该空格和其他空格,请通过在 "%c" 格式中预先添加 ' ' 来使用它们。

1) 检查 scanf() 结果。

2) 在"%c"之前使用空格来消耗空格,特别是上一行的\n

3) 正确使用main()

4) 简单打印字符串时最好使用 fputs() 或 puts()

编辑:满足输入短线的能力

#include<stdio.h>
#include<stdlib.h>

void ConsumeToEOL(void) {
  int ch;
  do {
    ch = getchar();
  } while (ch != '\n' && ch != EOF);
}

int main() {
  int nl, nc, i, j;
  // Space between "%d %d" not really needed
  if (scanf("%d%d", &nl, &nc) != 2) {
    fputs("Bad number Input\n", stdout);
    exit(1);
  }
  ConsumeToEOL();

  char matrix[nl][nc];
  for (i = 0; i < nl; i++) {
    for (j = 0; j < nc; j++) {
      int ch = getchar();
      if (ch == '\n' || ch == EOF)
        break;
      matrix[i][j] = (char) ch;
    }
    if (j == nc) ConsumeToEOL();
    for (; j < nc; j++) {
      matrix[i][j] = 0;
    }
  }
  // Better to use fputs() or puts() when simply printing a string
  fputs("This is your matrix:\n", stdout);
  for (i = 0; i < nl; i++) {
    for (j = 0; j < nc; j++) {
      if (matrix[i][j]) {
        printf("%c", matrix[i][j]);
      }
    }
    // Add EOL
    fputs("\n", stdout);
  }
  return 0;
}

关于c - C 中的 Char 矩阵 - 使用 Scanf 或 getchar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23087070/

相关文章:

c - 我怎样才能清理lua的注册表?

如果 malloc 失败,C 释放二维数组

c - 使用 g++ 编译时未定义对 sem_wait 和 pthread_create 的引用

c - 如何将函数输出(数组)分配给c中的另一个函数?

C - 匿名结构有什么优势?

c - 使用C将字符串分成两半

c 编程语言 - declare() 函数

c - 即使在无法访问的 ICMP 端口上,select() 也会超时 3 秒

c - 动态分配二维数组以匹配 LINES 和 COLS

C - 如何计算文件中每个单词的出现次数并删除重复单词