C编程指针和字符串操作
C programming Pointer and String operations
所以我有一个作业需要更改某些函数,方法是将指针操作替换为数组操作,并将字符串操作替换为字符操作。现在我对指针、数组、字符串等有了基本的了解,但我不明白我必须做什么,以及我应该如何去做。这是代码:
#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] = '[=10=]'; // 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);
}
以下是我正在努力解决的问题:
重写函数randommaze(row, column),用指针操作代替所有数组操作。你不能使用像 maze[i][j] 这样的索引操作,除了获取指针的初始值。
重写函数printmaze(row, column),用字符串操作代替所有字符操作。
如果有人可以向我解释我应该做什么以及我应该如何做,我将不胜感激。谢谢!
问题 2.:
数组可以用作指向其第一个成员的指针。因此,例如 array[0]
和 *array
return 相同的东西 - 数组第一个元素的值。由于数组是连续的内存块,如果您递增(或添加偏移量)指向数组开头的指针,则指向数组的下一个元素。这意味着 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
来打印单个字符,我'我猜你应该使用一个函数来输出单个字符。类似于 putchar
.
希望这会引导您朝着正确的方向前进。
听起来你好像在上数据结构课程。第一个挑战是构建数组映射函数。例如:
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)));
}
我们正在做的是获取二维数组中第一个内存字节的地址 (*values),然后添加原始字节数作为偏移量以从 "array" 我们想要访问。
像这样的练习的要点之一是向您展示该语言在底层是如何实际工作的。这是他的数组映射函数的一般工作方式,除了可以快速实现更复杂的内存结构之外,还可以用作例如以后的语言或编译器设计课程的基础。
至于第二部分,我不是很清楚,因为 C 中没有实际的 "string" 操作。我需要更多细节。
所以我有一个作业需要更改某些函数,方法是将指针操作替换为数组操作,并将字符串操作替换为字符操作。现在我对指针、数组、字符串等有了基本的了解,但我不明白我必须做什么,以及我应该如何去做。这是代码:
#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] = '[=10=]'; // 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);
}
以下是我正在努力解决的问题:
重写函数randommaze(row, column),用指针操作代替所有数组操作。你不能使用像 maze[i][j] 这样的索引操作,除了获取指针的初始值。
重写函数printmaze(row, column),用字符串操作代替所有字符操作。
如果有人可以向我解释我应该做什么以及我应该如何做,我将不胜感激。谢谢!
问题 2.:
数组可以用作指向其第一个成员的指针。因此,例如 array[0]
和 *array
return 相同的东西 - 数组第一个元素的值。由于数组是连续的内存块,如果您递增(或添加偏移量)指向数组开头的指针,则指向数组的下一个元素。这意味着 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
来打印单个字符,我'我猜你应该使用一个函数来输出单个字符。类似于 putchar
.
希望这会引导您朝着正确的方向前进。
听起来你好像在上数据结构课程。第一个挑战是构建数组映射函数。例如:
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)));
}
我们正在做的是获取二维数组中第一个内存字节的地址 (*values),然后添加原始字节数作为偏移量以从 "array" 我们想要访问。
像这样的练习的要点之一是向您展示该语言在底层是如何实际工作的。这是他的数组映射函数的一般工作方式,除了可以快速实现更复杂的内存结构之外,还可以用作例如以后的语言或编译器设计课程的基础。
至于第二部分,我不是很清楚,因为 C 中没有实际的 "string" 操作。我需要更多细节。