Как сделать предложение из массива двумерных символов с помощью указателей - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в C, поэтому, пожалуйста, постарайтесь набраться терпения, если я не достаточно ясен.У меня есть задание, которое мне нужно, чтобы создать функцию, которая получает квадратную матрицу символов и делает из нее строку.Функция должна возвращать указатель на строку в конце концов, так что в основном я могу инициализировать строку с ней и напечатать ее в конце.

(также я ограничен в использовании только указателей внутри этой функции, а не обычныесинтаксис массивов)

например, матрица:

R O M E 
G O A L
H E A D
D E A D

, и я хочу сделать такое предложение: "ROME GOAL HEAD DEAD".

Я пытался сделать дляцикл, который выполняется только для строк матрицы, так что я могу взять каждую строку и скопировать в строку, которую я уже подготовил ранее (с достаточным пространством), в первой строке, которую я использовал strcpy(), а другую strcat().

Ничего не произошло.

Извините за мой английский, и спасибо.

char * makeString(char *smallMat, int rows, char *pStr ) {
    int i;
    char sentence[(rows * rows) + rows + rows];
    pStr = &sentence;
    for (i = 0; i < rows; ++i) {
        if (i == 0) {
            strcpy(sentence, *(smallMat + i));
        }
        else{
            strcat(sentence, ' ' + *(smallMat + i));
        }
    }
    return pStr;
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Самый простой способ создать предложение из двумерного массива из SIZE строк и столбцов символов - просто создать массив из SIZE * SIZE + SIZE символов для хранения предложения (SIZE * SIZE для каждого символа плюс SIZE - 1 пробелы плюс символ , заканчивающийся нулями )

После объявления массива, содержащего ваше предложение, передайте и новый массив, и ваш 2D-массив функции makestring() и зациклите каждый символ в 2D-массиве, добавив пробел перед каждым словом ( за исключением 1-го слова) и, наконец, nul-terminate ваш новый массив создает C-строку.

Вы не можете использовать strcpy (или любую другую функцию, ожидающую C-строку) в строке символов в вашем 2D-массиве, поскольку строки символов в вашем 2D-массиве не являются строками с нулевым символом в конце. (ваш 2D массив - это просто 2D массив символов). Вы должны зациклиться и назначить каждый символ на позицию в вашем одномерном массиве.

В целом, вы могли бы написать makestring(), похожий на:

#define SIZE 4

char *makestring (char *str, char (*a)[SIZE])
{
    char *p = str;   /* a pointer to 1st character in str */
    for (int i = 0; i < SIZE; i++) {    /* for each row   */
        if (i)                          /* if row not 1st */
            *p++ = ' ';                 /*    add space   */
        for (int j = 0; j < SIZE; j++)  /* for each char  */
            *p++ = a[i][j];             /*    copy to str */
    }
    *p = 0;         /* nul-terminate string */

    return str;     /* return pointer to string (for convenient use in-line) */
}

( примечание: возврат указателя на начало str позволит использовать функцию в строке, например: printf ("str: '%s'\n", makestring (str, matrix)); Как уже упоминалось, это просто для удобства, вы можете сделать функция типа void, поскольку вы не выделяете ее и предоставили указатель на массив, который будет обновлен внутри функции и может быть проверен обратно в вызывающей стороне перед использованием.)

Добавив короткую тестовую программу, вы можете проверить свою функцию следующим образом:

#include <stdio.h>

#define SIZE 4

char *makestring (char *str, char (*a)[SIZE])
{
    char *p = str;   /* a pointer to 1st character in str */
    for (int i = 0; i < SIZE; i++) {    /* for each row   */
        if (i)                          /* if row not 1st */
            *p++ = ' ';                 /*    add space   */
        for (int j = 0; j < SIZE; j++)  /* for each char  */
            *p++ = a[i][j];             /*    copy to str */
    }
    *p = 0;         /* nul-terminate string */

    return str;     /* return pointer to string (for convenient use in-line) */
}

int main (void) {

    char matrix[SIZE][SIZE] = { {'R','O','M','E'},  /* square 2D array */
                                {'G','O','A','L'},
                                {'H','E','A','D'},
                                {'D','E','A','D'} },
        str[SIZE * SIZE + SIZE] = "";               /* array to hold sentence */

    makestring (str, matrix);           /* call makestring */
    if (*str != 0)                      /* validate str not empty-string */
        printf ("str: '%s'\n", str);    /* output string */
}

Пример использования / Вывод

Запуск программы приведет к:

$ ./bin/makestring
str: 'ROME GOAL HEAD DEAD'

( примечание: одинарные кавычки добавлены вокруг строки, чтобы утвердительно показать начало и конец строки)

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 26 апреля 2019

Как указал @anonmess, вы не можете использовать strcpy() и т. Д. Для последовательностей символов, не заканчивающихся на 0.Как вы сами сказали, задача состоит в том, чтобы использовать указатели.Если бы вы использовали strcpy() (и если бы это работало), вы бы обошли это назначение;)

Вот полное решение, в котором не используется pStr.

#include <stdio.h>  // printf()
#include <stdlib.h> // malloc()

static char smallMat[4][4] = {
    { 'R', 'O', 'M', 'E' },
    { 'G', 'O', 'A', 'L' },
    { 'H', 'E', 'A', 'D' },
    { 'D', 'E', 'A', 'D' }
};

char* makeString(char* smallMat, int rows) {
  int currentRow, currentColumn;

  /* space for all characters (rows * rows)
   * + one character for each space + terminating '\0'. */
  char* sentence = malloc((rows * rows) + rows);

  char* p = sentence;

  for (currentRow = 0; currentRow < rows; ++currentRow) {
    for (currentColumn = 0; currentColumn < rows; ++currentColumn) {
      *p++ = *(smallMat + (currentRow * rows) + currentColumn);
    }
    *p++ = ' ';
  }
  *--p = '\0'; /* replace the last space with terminating 0,
                * so it can be printed. */
  return sentence;
}

int main() {
  char* output = makeString(smallMat, 4);
  printf(output);
  free(output);
  return 0;
}
...