簡體   English   中英

打印 2 個字符並通過動態分配的 2d 數組保存它們

[英]printing 2 characters and keeping them through dynamically allocated 2d array

您好,我正在嘗試使用 2d 數組打印類似的東西。 請注意,當用戶輸入相同的數字時,字符應打印在現有字符的上方。

預期成績:

Input 1: 3  //user1 inputs 3

****
****
**x*

Input 2: 1 //user2 inputs 1

****
****
y*x*

Input 3: 1 //user1 inputs 1

****
x***
y*x*

當前結果:

enter first: 3
3***
***
**x
enter second: 1
1******
******
xx****
enter first: 2
2*********
*********
***xxx***

但將打印值保留在其以前的位置。 問題是它們沒有按正確的順序打印。 而且似乎我還沒有用動態分配的二維數組做最好的工作。 這是我嘗試過的東西:

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

int num(int term)
{
  int number1;
  int number2;
  if(term==1)
  {
    scanf("%d", &number1);
    return number1;
  }
  if (term==2)
  {
     scanf("%d", &number2);
    return number2;
  }
  return 0;
}
void function(int a, int b, int result[], int size)
{

  int i = 0;
  int j = 0;
  int desired_num = 0;
  int count = 0;
  int *arr[a];

  for (i = 0; i < a; i++)
    arr[i] = (int *)malloc(a * sizeof(int));

  for (i = 0; i < a; i++)
    for (j = 0; j < b; j++)
      arr[i][j] = ++count;

  for (i = 0; i < a; i++)
  {
    for (j = 0; j < b; j++)
    {
      for (int counter = 0; counter < size; counter++)
      {
        if (arr[i][j] == arr[a - 1][result[counter] - 1])
        {
          arr[i][j] = desired_num;
        }

        if (arr[i][j] == desired_num)
        {
          printf("%s", "x");
        }
        else
        {
          printf("*");
        }
      }
    }
    printf("\n");
  }
}
int main()
{
  int counter = 1;
  int i = 0;
  int given_number;
  int array[20];
  for (;;)
  {
    if (counter % 2 != 0)
    {
      printf("enter first: ");
      given_number = num(1);
      printf("%d", given_number);
    }
    else
    {
      printf("enter second: ");
      given_number = num(2);
      printf("%d", given_number);
    }
    array[i] = given_number;
    function(3, 3, array, counter);
    counter++;
  }

  return 0;
}
array[i] = given_number;

i的值永遠不會改變0 您只會在每次迭代時覆蓋array的第一個元素。 其他 19 個元素仍處於不確定狀態。

counterarray分別作為sizeresult傳遞給function

這意味着隨着size的增加,它被用作訪問result元素的邊界; 包含不確定值的元素。

for (int counter = 0; counter < size; counter++)
{
    if (arr[i][j] == arr[a - 1][result[counter] - 1])

這肯定會導致未定義的行為,因為這些不確定的值用於索引arr ,從而有效地訪問隨機內存偏移量。 僅憑這一事實就很難對您所看到的輸出進行推理,因為實際上任何事情都是有效的。


雖然完全有效,但動態分配的可變長度數組是一個有點令人困惑的選擇,尤其是考慮到您在使用完malloc分配的內存時未能free它。

int *arr[a];

for (i = 0; i < a; i++)
    arr[i] = (int *)malloc(a * sizeof(int));

int arr[a][b]; 會起作用,因為ab不是堆棧破碎的大值(或非正數)。 無論如何,您現在或將會受到main array大小的限制。


三重嵌套循環充其量是混亂的。 只有打印x*字符的邏輯,所以你顯然永遠不會看到y

對於arr的每個元素,您遍歷result的每個元素。 如果arr的當前元素等於最后一行 ( arr[a - 1] ) 中result的當前值 ( [result[counter] - 1] ) 選擇的列的值,則打印x ,否則為*

再次使用UB的不確定值result ,但您可以看到您正在打印a * b * size字符,加上換行符,每次迭代。

這是嚴重缺陷。


其他一些注意事項:

num函數中if .. else語句的兩個分支執行完全相同的操作,只是標識符不同。

mainif .. else語句的兩個分支是相同的,除了每個分支中的第一個printf和傳遞給num的整數值,它們具有相同的效果。

這意味着唯一需要分支的是printf參數。

獲取整數的通用函數可以正常工作

int get_num(void)
{
    int n;

    if (1 != scanf("%d", &n)) {
        fprintf(stderr, "Could not read input.\n");
        exit(EXIT_FAILURE);
    }

    return n;
}

用於main內部

if (counter % 2 == 0)
    printf("enter first: ");
else
    printf("enter second: ");

given_number = get_num();

一個小問題: printf("%d", given_number); 稍微混淆了輸出。


沒有理由重復生成數組。 main中初始化一個數組作為程序的狀態 隨着時間的推移,用用戶的選擇填充它,並在每次迭代時簡單地打印數組。

確保始終檢查scanf的返回值是預期的轉換次數,並確保用戶提供的整數不會訪問無效內存。

這是一個粗略的例子。

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

#define EMPTY '*'
#define PLAYER_ONE 'X'
#define PLAYER_TWO 'O'

int get_num(void)
{
    int n;

    if (1 != scanf("%d", &n)) {
        fprintf(stderr, "Could not read input.\n");
        exit(EXIT_FAILURE);
    }

    return n;
}

int main(void)
{
    const size_t rows = 6;
    const size_t cols = 7;

    char board[rows][cols + 1];

    memset(board, EMPTY, sizeof board);

    /* our rows are now strings */
    for (size_t i = 0; i < rows; i++) {
        board[i][cols] = '\0';
        puts(board[i]);
    }

    unsigned char turn = 1;

    while (1) {
        printf("Player %s, Enter column #(1-%zu): ",
                turn & 1 ? "One" : "Two", rows);

        int input = get_num();

        if (1 > input || input > cols) {
            printf("Invalid column [%d]. Try again...\n", input);
            continue;
        }

        size_t sel = input - 1;

        if (board[0][sel] != EMPTY) {
            printf("Column [%d] is full! Try again...\n", input);
            continue;
        }

        size_t n = rows;

        while (n--) {
            if (board[n][sel] == EMPTY) {
                board[n][sel] = turn & 1 ? PLAYER_ONE : PLAYER_TWO;
                break;
            }
        }

        for (size_t i = 0; i < rows; i++)
            puts(board[i]);

        turn ^= 1
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM