【问题标题】:How to make a Sentence out of 2D char array using pointers如何使用指针从二维字符数组中创建一个句子
【发布时间】:2019-04-25 19:49:20
【问题描述】:

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

(我也被限制在这个函数中只使用指针而不是常规数组语法)

例如矩阵是:

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

我想写一个这样的句子:"ROME GOAL HEAD DEAD"

我尝试创建一个只在矩阵行上运行的 for 循环,这样我就可以在我使用的第一行中获取每一行并复制到我之前已经准备好的字符串(其中有足够的空间)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;
}

【问题讨论】:

  • strcpystrcat 仅适用于以 null 结尾的数组,因此请确保这是格式。除此之外,我相信您需要为返回字符串动态分配内存,因为在静态分配中使用变量不应该起作用,尽管一些编译器会隐藏它。
  • 当你将指针返回到静态数组时,该位置的内存可能会也可能不会被保留,因为它在堆栈上,并且可能会在函数结束后被覆盖。跨度>
  • @Y.tec 您能否澄清pStr 是什么以及返回值应该是什么?函数应该返回构造的字符串还是应该将字符串写入pStr?返回值和pStr 似乎是多余的。

标签: c arrays pointers char


【解决方案1】:

正如@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;
}

【讨论】:

    【解决方案2】:

    SIZE 字符行和列的二维数组创建句子的最简单方法是简单地创建一个SIZE * SIZE + SIZE 字符数组来保存句子(SIZE * SIZE 为每个字符加上@ 987654324@ 空格,加上 nul 终止符

    在声明一个数组来保存你的句子之后,将新数组和你的二维数组都传递给你的makestring() 函数并循环遍历二维数组中的每个字符,在每个单词之前添加一个空格之前 (除了第一个单词)最后 nul-terminate 你的新数组创建了一个 C 字符串。

    您不能在二维数组中的字符行上使用strcpy(或任何其他需要 C 字符串的函数),因为二维数组中的字符行不是以 nul 结尾的字符串。 (您的二维数组就是这样,一个二维字符数组)。您必须循环并将每个字符分配到一维数组中的一个位置。

    总而言之,你可以写成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'
    

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

    查看一下,如果您还有其他问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多