无法将char字符串插入char数组

时间:2018-11-06 06:17:33

标签: c pointers for-loop multidimensional-array

  int row = 5;
  int column = 10;
  char **array;
  int rowcount = 0;
  array = (int **) malloc(sizeof(int *) * row);
  char *x_ptr = array;
  for (int i = 0; i < row; i++) {
    array[i] = (int *) malloc(sizeof(int) * column);
    x_ptr[i] = (int *) malloc(column * sizeof(int));
  }
  for (int i = 0; i < row; i++)
  {

    for (int j = 0; j < column; j++) {
      if (j == 0) {
        rowcount += 1;
        char snum[5] = {'\0'};
        sprintf(snum, "%d", rowcount); //converts int to char
        for (int t = 0; t < strlen(snum); t++)
          *(x_ptr + (i * column + j) + t) = snum[t];
      } else {
        *(x_ptr + (i * column + j)) = 0;
      }
    }

只是尝试向列0上的数组添加一些整数值。但是,当尝试添加数字(如10)时,sprintf命令将值拆分为snum [0] = 49'1'和snum [1] = 48' 0'。但是该数组仅接受snum [0],而snum [1]被完全忽略。

如果我对指针位置的理解不正确,请纠正我。

1 个答案:

答案 0 :(得分:0)

好的,我已经尽力了,但是这段代码有很多错误,基本上是无法恢复的。请仔细看一下上面的注释,发布一些可编译的代码,告诉我们您期望它做什么,做什么做什么以及这两者之间的区别。

此谜题的核心可能是您正在使用两种不同的技术来访问二维数组。假设您要有一个包含n行和m列的整数数组。您可以这样声明:

int **array1 = malloc(n * sizeof(int *));
for (int a=0; a<n; a++)
  array1[a] = malloc(m * sizeof(int));

通过这种方式,您可以将i行和j列中的整数作为array1[i][j]来访问。

或者,您可以通过声明以下内容来做到这一点:

int *array2 = malloc(n * m * sizeof(int));

并以i的形式访问行j和列array2[i * m + j]中的整数。

以下是一些应编译的代码

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

int row = 5;
int column = 10;
//  char **array;  // declaration moved into main()
int rowcount = 0;

int main(void) {  // added main() function
  int **array = malloc(sizeof(int *) * row); // include type (int **); remove cast: (int **); moved into main()
  int **x_ptr = array;  // changed type to int **; moved into main()

  // Allocate memory for array, so we can assign integers to
  //   array[i][j] where:
  //     i <= 0 < column
  //     j <= 0 < column
  //  Note that:
  //    array[i]
  //  is identical to:
  //    *(array + i)
  //  and:
  //    array[i][j]
  //  is identical to:
  //    *(*(array + i) + j)
  for (int i = 0; i < row; i++) {
    // array[i] = malloc(sizeof(int) * column);  // removed cast, you're not using array[] anyway
    x_ptr[i] = malloc(column * sizeof(int));  // removed cast
  } 

  for (int i = 0; i < row; i++)
  {

    for (int j = 0; j < column; j++) {
      if (j == 0) {
        rowcount += 1;

        // Create a character buffer.
        char snum[5] = {'\0'};

        // Write the text version of integer "rowcount" into the char
        //   buffer "snum"
        sprintf(snum, "%d", rowcount); //converts int to char

        // Copy the char value of each character into the
        //   two-dimensional integer array. We want to copy
        //   snum[t] into array[i][t]
        for (size_t t = 0; t < strlen(snum); t++)
          // *(x_ptr + (i * column + j) + t) = snum[t];
          array[i][t] = snum[t];
      } else {
        // *(x_ptr + (i * column + j)) = 0;
        array[i][j] = 0;
      }
    }
  }

  for (int i=0; i<row; i++)
    for (int j=0; j<column; j++)
      printf("Row %d, column %d has value %d\n", i, j, array[i][j]);

  return 0;
}

我将文件另存为so.c,并且正在使用以下命令对其进行编译:

gcc -o so -W -Wall -pedantic so.c

这会为您不想在原始代码中执行的许多操作打开警告。它可能无法解决您所遇到的确切问题,但应该可以为您提供一些帮助。