C编程指针和字符串操作

时间:2015-02-09 01:23:37

标签: c arrays pointers

所以我有一个赋值,我需要通过将指针操作替换为数组操作来改变某些函数,并将字符串操作替换为字符操作。现在我对指针,数组,字符串等有了基本的了解,但是我无法理解我必须做什么,以及我应该如何去做。这是代码:

#include <stdio.h>
#pragma warning(disable: 4996)

// This program exercises the operations of pointers and arrays
#define maxrow 50
#define maxcolumn 50

char maze[maxrow][maxcolumn]; // Define a static array of arrays of characters.
int lastrow = 0;

// Forward Declarations
#define triple(x) x % 3 == 0
void initialization(int, int);
void randommaze(int, int);
void printmaze(int, int);



void initialization(int r, int c) {
    int i, j;
    for (i = 0; i < r; i++){
        maze[i][0] = 'X';     // add border 
        maze[i][c - 1] = 'X'; // add border 
        maze[i][c] = '\0';    // add string terminator 

        for (j = 1; j < c - 1; j++)
        {
            if ((i == 0) || (i == r - 1))
                maze[i][j] = 'X'; // add border 
            else
                maze[i][j] = ' '; // initialize with space 
        }
    }
}

// Add 'X' into the maze at random positions
void randommaze(int r, int c) {
    int i, j, d;
    for (i = 1; i < r - 1; i++) {
        for (j = 1; j < c - 2; j++) {
            d = rand();
            if (triple(d))
            {
                maze[i][j] = 'X';
            }
        }
    }
    i = rand() % (r - 2) + 1;
    j = rand() % (c - 3) + 1;
    maze[i][j] = 'S'; // define Starting point
    do
    {
        i = rand() % (r - 2) + 1;
        j = rand() % (c - 3) + 1;
    } while (maze[i][j] == 'S');

    maze[i][j] = 'G'; // define Goal point
}

// Print the maze
void printmaze(int r, int c) {
    int i, j;
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++)
            printf("%c", maze[i][j]);
        printf("\n");
    }
}

void main() {
    int row, column;
    printf("Please enter two integers, which must be greater than 3 and less than maxrow and maxcolomn, respectively\n");
    scanf("%d\n%d", &row, &column);
    while ((row <= 3) || (column <= 3) || (row >= maxrow) || (column >= maxcolumn)) {
        printf("both integers must be greater than 3. Row must be less than %d, and column less than %d. Please reenter\n", maxrow, maxcolumn);
        scanf("%d\n%d", &row, &column);
    }
    initialization(row, column);
    randommaze(row, column);
    printmaze(row, column);
    //encryptmaze(row, column);
    //printmaze(row, column);
    //decryptmaze(row, column);
    //printmaze(row, column);
}

以下是我正在努力解决的问题:

  1. 通过将指针操作替换为所有数组操作来重写函数randommaze(row,column)。除了获取指针的初始值之外,您不能使用像迷宫[i] [j]这样的索引操作。

  2. 通过将字符串操作替换为所有字符操作来重写函数printmaze(row,column)。

  3. 如果有人能够向我解释我应该做什么以及我应该怎么做,我会非常感激。谢谢!

2 个答案:

答案 0 :(得分:0)

问题2:

数组可以用作指向它的第一个成员的指针。因此,例如,array[0]*array返回相同的东西 - 数组的第一个元素的值。由于数组是连续的内存块,如果向指向数组开头的指针递增(或添加偏移量),则指向数组的下一个元素。这意味着array[1]*(array + 1)是相同的。

如果你有一个迭代索引数组的for循环,你也可以使用指针增量来编写它。例如:

/* Loop indexing an array */
int my_array [10];
int i = 0;
for(; i < 10; ++i) {
    my_array[i] = 0;
}

/* Loop by offsetting a pointer */
int my_array [10];
int i = 0;
int *ptr = my_array; /* Make it point to the first member of the array*/
for(; i < 10; ++i) [
    *(ptr + i) = 0;
}

/* Looping by incrementing the pointer */
int my_array [10];
int *ptr = my_array; /* Make it point to the first member of the array */
int *end_ptr = my_array + 10; /* Make a pointer pointing to one past the end of the array */
for(; ptr != end; ++ptr) [
    *ptr = 0;
}

所有这些代码示例都做同样的事情。将0分配给数组的所有成员。如果你有一个多维数组,请记住它仍然只是一个连续的内存块。

问题3:

这个问题对我来说并不是那么清楚,所以我对你期望做的事情的解释可能有些偏差,但是因为你只是用printf打印单个字符,我猜您应该使用函数来输出单个char。类似于putchar

希望这会引导你朝着正确的方向前进。

答案 1 :(得分:0)

听起来好像您正在从事数据结构课程。第一个挑战是构建数组映射函数。例如:

int main(int argc, char **argv)
{
    int values[20][40];
    values[0][0] = 1;
    values[10][10] = 20;
    /* Let's print these two ways */

    printf("0,0: %d  10,10: %d\n", values[0][0], values[10][10]);
    printf("0,0: %d  10,10: %d\n", *((*values) + (sizeof(int) * 0) + sizeof(int) * 0)), *((*values) + (sizeof(int) * 10) + sizeof(int) * 10)));
}

我们正在做的是获取2d数组中内存的第一个字节的地址(*值),然后添加一个原始字节数作为偏移量来定位来自&#34;数组的值#34;我们想要访问。

这样的练习的一个要点就是向您展示语言实际上是如何运作的。这是他的数组映射函数如何工作,并且可以用作基础,例如,稍后用于语言或编译器设计课程,以及更复杂的存储器结构的快速实现。

至于第二部分,由于没有实际的&#34;字符串&#34;我对此并不十分清楚。 C内置的操作。我需要更多详细信息。