[英]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 個元素仍處於不確定狀態。
counter
和array
分別作為size
和result
傳遞給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];
會起作用,因為a
和b
不是堆棧破碎的大值(或非正數)。 無論如何,您現在或將會受到main
array
大小的限制。
三重嵌套循環充其量是混亂的。 只有打印x
和*
字符的邏輯,所以你顯然永遠不會看到y
。
對於arr
的每個元素,您遍歷result
的每個元素。 如果arr
的當前元素等於最后一行 ( arr[a - 1]
) 中result
的當前值 ( [result[counter] - 1]
) 選擇的列的值,則打印x
,否則為*
。
再次使用UB的不確定值result
,但您可以看到您正在打印a * b * size
字符,加上換行符,每次迭代。
這是嚴重缺陷。
其他一些注意事項:
num
函數中if .. else
語句的兩個分支執行完全相同的操作,只是標識符不同。
main
中if .. 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.