如何在数组中移动字符

How to move a char in an Array?

本文关键字:移动 字符 数组      更新时间:2023-10-16

我要做的是在1D或2D数组中使用箭头键移动字符。我已经用"a"初始化了数组,这意味着它从索引#0开始,但当我交换时,它并没有给出预期的输出,而是给了我类似的东西:

a a a a a a a a a

它应该像这个

                a

这是我的代码

#include<iostream>
#include<Windows.h>
#include<conio.h>
#include<fstream>
#define RIGHT 77
#define LEFT 75
#define UP 72
#define DOWN 80
#define ESC 27

using namespace std;
void gotoxy(int, int);
void swap(char*,char*);
char arr[1024] = { "a"};
char *line_ptr = (char*)arr[0];
char *line_ptr2d =(char*)arr[0];

void main()
{
    for (int i = 1; i < 1024; i++)
    {
        arr[i] = ' ';
    }
    int x = 1;
    int y = 1;
    int ch;
    do
    {   
        //system("cls");
        int i = 0;
        gotoxy(x, y);
        ch = _getch();
        if (ch == 224)
        {
            ch = _getch();
            switch (ch)
            {
            case LEFT:
                x -= 1;
                line_ptr--;
                swap(&arr[i], &arr[i + 1]);
                //arr[i] = ' ';
                cout << arr[i];
                break;
            case RIGHT:
                x += 1;
                swap(&arr[i], &arr[i + 1]);
                if (arr[i-1] != NULL)
                {
                    arr[i - 1] = ' ';
                }
                cout << arr[i+1];
                break;
            case UP:
                y--;
                break;
            case DOWN:
                y++;
                break;
            }
        }
        i++;
    } while (1);
} 
void gotoxy(int x, int y)
{
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    _COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hConsole, pos);
} 
void swap(char *x, char *y)
{
    char temp = *x;
    *x = *y;
    *y = temp;
}

我将严格回答您的问题,然后向您指出代码中的其他一些问题。

您当前的问题是您打印的数据不正确。例如,当您向右"移动"时,在当前位置打印字符'a',然后执行gotoxy(x,y)。而您需要将' '放在当前位置,然后使用具有更新值的gotoxy(x,y)并放置'a'

-

其他一些问题:

1.

char *line_ptr = (char*)arr[0];
char *line_ptr2d =(char*)arr[0];

什么?为什么?你的意思是:

char *line_ptr = arr;
char *line_ptr2d = arr;

2.

你不会检查是否在你的数组限制内。

3.

无论向左还是向右移动,您都会将索引i提前。(在这种情况下,您可能应该使用现有的x索引)。

4.

char arr[1024] = { "a"}; // You probably meant char arr[1024] = {'a'};

在数组中交换两个字符后,只显示新的一个

swap(&arr[i], &arr[i + 1]);
cout << arr[i];

您还必须在i + 1位置上写一个空格,使其消失。