Самый простой способ создать предложение из двумерного массива из 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'
( примечание: одинарные кавычки добавлены вокруг строки, чтобы утвердительно показать начало и конец строки)
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.