Невозможно вставить строку char в массив char - PullRequest
0 голосов
/ 06 ноября 2018
  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 голосов
/ 07 ноября 2018

ОК, я очень старался, но есть , поэтому много вещей не так с этим кодом, что он в основном невосстановим. Пожалуйста, внимательно посмотрите на комментарии выше, опубликуйте некоторый код, который можно скомпилировать, расскажите нам, что вы ожидаете от него, что он делает и делает и в чем разница между этими двумя вещами.

Суть этой загадки, возможно, в том, что вы используете два разных метода для доступа к двумерному массиву. Допустим, вы хотите иметь массив целых чисел с 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

Это включает предупреждения для многих вещей, которые вы не хотите делать в исходном коде. Вероятно, это не решит проблему, которая у вас есть, но она должна дать вам кое-что для работы.

...