我是C的新手,所以如果我不够清楚,请尽量耐心等待。我有一个赋值,我需要创建一个函数,得到一个平方的char矩阵并从中生成一个字符串。函数应该最终返回一个指向字符串的指针,这样在main中我可以用它初始化一个字符串并最后打印它。
(我也限制只使用此函数内的指针而不是常规数组语法)
例如矩阵是:
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;
}
正如@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;
}
从SIZE
行和字符列的2D数组创建句子的最简单方法是创建一个SIZE * SIZE + SIZE
字符数组来保存句子(每个字符的SIZE * SIZE
,加上SIZE - 1
空格,加上nul-terminating字符)
在声明一个数组来保存你的句子之后,将新数组和你的2D数组传递给你的makestring()
函数并循环遍历2D数组中的每个字符,在每个单词之前添加一个空格(第一个单词除外),最后是nul-terminate你的新数组创建一个C字符串。
您不能在2D数组中的字符行上使用strcpy
(或任何其他期望C字符串的函数),因为2D数组中的字符行不是以空字符结尾的字符串。 (你的2D数组只是一个2D数组的字符)。您必须循环并将每个字符分配到1D数组中的位置。
完全放在一起,你可以写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'
(注意:在字符串周围添加单引号以肯定地显示字符串的开头和结尾)
仔细看看,如果您有其他问题,请告诉我。