如何使用指针从2D char数组中提取句子

时间:2019-04-25 19:49:21

标签: c arrays pointers char

我是C的新手,所以如果我不太清楚,请耐心等待。 我有一个分配,我需要做一个获取平方字符矩阵并从中取出字符串的函数。 该函数最终应返回一个指向字符串的指针, 这样一来,我就可以使用它初始化一个字符串并最终打印出来。

(同样,我只能在此函数内使用指针,而不能使用常规数组语法)

例如,矩阵为:

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

我想这样写:"ROME GOAL HEAD DEAD"

我试图制作一个仅在矩阵行上运行的for循环,因此我可以将每一行复制到我在使用{{1}的第一行中已经准备好的字符串(其中有足够的空间) }和其他strcpy()

什么都没发生。

对不起,我的英语,谢谢。

strcat()

2 个答案:

答案 0 :(得分:0)

正如@anonmess指出的那样,对于非0终止的字符序列,不能使用strcpy()等。正如您自己说的那样,任务是使用指针。如果您使用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;
}

答案 1 :(得分:0)

SIZE个字符的行和列的二维数组创建句子的最简单方法是简单地创建一个SIZE * SIZE + SIZE个字符的数组来容纳该句子(SIZE * SIZE每个字符,加上SIZE - 1空格,再加上 nul-终止字符)

在声明要保留句子的数组后,将新数组和2D数组都传递给makestring()函数,并在2D数组中的每个字符上循环,在之前添加一个空格每个单词(第一个单词除外),最后 nul-terminate 新数组创建一个C字符串。

您不能在2D数组中的字符行上使用strcpy(或任何其他期望使用C字符串的函数),因为2D数组中的字符行不是以n结尾的字符串。 (您的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'

注意:在字符串周围添加单引号以肯定地显示字符串的开头和结尾)

仔细检查一下,如果还有其他问题,请告诉我。