我应该返回输入字符串共有的二维字符串单词数组。
div {
background: green;
line-height: 40px; # or height: 40px;
text-align: center;
}
span {
background: white;
display: inline-block;
}
当我编译它时,我得到错误:数组类型具有不完整的元素类型。由于我需要在函数内分配内存,因此我使用#include <stdio.h>
#include <malloc.h>
#define SIZE 31
int strcmp1(char *word1, char *word2, int len) {
while (len-- > 0) {
if (!(*word1++ == *word2++))
return -1;
}
return 0;
}
void strcpy1(char *emptyStr, char *str, int len) {
while (len-- > 0) {
*emptyStr++ = *str++;
}
*emptyStr = '\0';
}
void print(char *str) {
for (; *str;)
printf("%c", *str++);
printf("\n");
}
char **commonWords(char *str1, char *str2) {
char *temp1, *temp2;
char commWords[][] = (char**)calloc(10, SIZE);
int i = 0;
if (str1 == NULL || str2 == NULL) {
return NULL;
}
for (temp1 = str1; *temp1; ++temp1) {
if (*temp1 != ' ') {
str1 = temp1;
while (*temp1++ != ' ')
;
int len1 = temp1 - str1;
for (temp2 = str2; *temp2; ++temp2) {
if (*temp2 ! =' ') {
str2 = temp2;
while (*temp2++ != ' ')
;
int len2 = temp2 - str2;
if (len1 == len2) {
if (strcmp1(str1, str2, len1)) {
strcpy1(commWords[i++], str1, len1);
}
}
}
}
}
}
commWords[i] = NULL;
return commWords;
}
int main() {
char *name1 = "abc def ghi";
char *name2 = "ghi abc jkl";
char common[][31] = commonWords(name1, name2);
int i = 0;
while (common[i++] != NULL) {
printf("%s\n", common[i]);
}
}
动态分配最多10个长度为calloc
的常用字(定义为31)。有没有办法不预先声明常用字的数量(即数组的第一个维度)?为什么我会收到此错误?这个问题有更优雅的解决方案吗?
答案 0 :(得分:0)
你错了。
首先,如果要拥有2D动态数组样式,请使用指向指针的指针。 请记住,这不是2D阵列!
Buffer
然后为指针分配内存:
char ** commWords;
然后,对于每个单词,分配单独的内存
//Allocate memory for 10 pointers to char
commWords = malloc(sizeof(*commWords) * 10);
然后按预期使用已分配的内存。
答案 1 :(得分:0)
您的代码中存在许多问题:
数组数组(也称为2D数组)与指向数组的指针数组不同。混合2是不正确的并且必然会失败。
common
中main
的定义不正确:char commWords[][] = (char**)calloc(10, SIZE);
。你可以这样修理它:
char (*commWords)[SIZE] = calloc(sizeof(*commWords), 10);
但其余的代码与commWords
是一个2D数组是不一致的,定义commonWords()
以返回指向数组数组的指针的语法会非常复杂。
打印常用字符串的while
循环也是假的:在i
语句中使用printf()
之前,请先增加strspn()
。
这是一种更经典的方法来实现您的目标,使用指向字符串的指针数组,以及标准但很少使用的函数strcspn()
和#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void freeWords(char **arr) {
if (arr) {
for (size_t i = 0; arr[i]; i++) {
free(arr[i]);
}
free(arr);
}
}
/* return a NULL terminated array of strings or NULL upon memory allocation failure */
char **commonWords(const char *str1, const char *str2) {
size_t n = 0;
char **common = calloc(sizeof(*common), n + 1);
size_t pos1, len1, pos2, len2;
if (common == NULL)
return NULL; /* failure */
common[0] = NULL;
for (pos1 = 0;;) {
pos1 += strspn(str1 + pos1, " ");
if (str1[pos1] == '\0')
break;
len1 = strcspn(str1 + pos1, " ");
for (pos2 = 0;;) {
pos2 += strspn(str2 + pos2, " ");
if (str2[pos2] == '\0')
break;
len2 = strcspn(str2 + pos2, " ");
if (len1 == len2 && !memcmp(str1 + pos1, str2 + pos2, len1)) {
char *w = calloc(sizeof(*w), len1 + 1);
if (w == NULL) {
freeWords(common);
return NULL;
}
char **p = realloc(common, sizeof(*p) * (n + 2));
if (!p) {
free(w);
freeWords(common);
return NULL;
}
common = p;
memcpy(w, str1 + pos1, len1);
common[n++] = w;
common[n] = NULL;
break;
}
pos2 += len2;
}
pos1 += len1;
}
return common;
}
int main(void) {
const char *name1 = "abc def ghi";
const char *name2 = "ghi abc jkl";
char **common = commonWords(name1, name2);
if (common) {
for (size_t i = 0; common[i] != NULL; i++) {
printf("%s\n", common[i]);
}
freeWords(common);
}
return 0;
}
:
<?php
/**
* Class Yii
* @method static CApplication app()
*/
class Yii extends YiiBase
{
}
/**
* Class CApplication
*
* @property User $user
*/
class CApplication extends CModule
{
}