使用字符串数组填充堆(malloc)

时间:2009-10-18 03:07:29

标签: c heap

我正在尝试使用字符串数组填充堆,但是在编译时控制台没有给我任何东西。我不知道我做错了什么......

void spellCheck(char article[], char dictionary[]) {
    int i = 0;
    char* tempArticle;
    while ( article[i] != '\0'){
        i++;
    }
    tempArticle = malloc(i);
    i=0;
    while (article[i] != '\0'){
        strcpy(tempArticle, article[i]);
    }
    printf("%s", tempArticle);
}

6 个答案:

答案 0 :(得分:5)

您可以使用strlen作为字符串长度。此外,您经常使用strcpy。最终,您只复制空终止符。 strcpy函数可以帮到你。 strcpy将每个字符复制到预期的空终止符到新缓冲区中。换句话说,您不能一次复制一个字符,而是一次复制一个字符串。虽然,我不确定你的功能目前是做什么的。

void spellCheck(char article[], char dictionary[]) {
    int i = 0;
    char* tempArticle;

    /*while ( article[i] != '\0'){
        i++;
     }*/

    tempArticle = malloc((strlen(article)+1) * sizeof(char));
    /*i=0;
    while (article[i] != '\0'){
        strcpy(tempArticle, article[i]);
    }*/

     strcpy(tempArticle, article);
    printf("%s", tempArticle);
}

再说一遍,换句话说,你的第二个循环本质上是试图将一个越来越小的字符串复制到tempArticle缓冲区,直到你最终将空字符串复制到其中。

(小问题,另一个回答者指出你的第二个循环是一个无限循环因为i没有增加。但是,你还有其他问题提到了)

修改

所以回答将其转换为小写的评论。通常,要将整个字符串转换为小写,您只需执行以下操作:

char s[] = "THE String.";
char *c;
for(c = s; *c != '\0'; c++)
    *c = (char)tolower(*c);

答案 1 :(得分:2)

strcpy复制整个字符串,而不仅仅是一个字符。 http://cplusplus.com/reference/clibrary/cstring/strcpy/

此外,strlen()返回字符串的长度。你可以通过类似的方式使代码更短更易读:

void spellCheck(char article[], char dictionary[])
{
    char *tempArticle = malloc(sizeof(char)*(strlen(article)+1));
    strcpy(tempArticle, article);
    // deal with tempArticle
    free(tempArticle)
}

malloc行中的+1是为了使行尾字符获得空格。

答案 2 :(得分:1)

这个

i=0;
while (article[i] != '\0') {
  strcpy(tempArticle, article[i]);
}

是一个无限循环(除非article[0]碰巧为0)。你需要确定一下。虽然代码中有很多东西需要修复,但这是一个好的开始。

答案 3 :(得分:1)

很多人似乎认为你正在尝试复制一个字符串。主题和你的介绍似乎不是这样的。你确定你不是想做这样的事吗?

void spellCheck(char *article[], char dictionary[]) {
    int i = 0;
    char** tempArticle;
    while (article[i] != NULL) {
        i++;
    }
    tempArticle = malloc(i*sizeof(char*));
    i=0;
    while (article[i] != NULL) {
        tempArticle[i] = strdup(article[i]);
        i++;
    }
}

答案 4 :(得分:0)

你没有增加我:

while(article [i]!='\ 0'){         strcpy(tempArticle,article [i]);     }

答案 5 :(得分:0)

问题在于:

i = 0;
while (article[i] != '\0') {
  strcpy(tempArticle, article[i]);
}

Strcpy复制整个字符串,你忘了增加i,而strcpy期望第二个参数是char指针(不是char)。所以你一遍又一遍地将垃圾复制到tempArticle中。

试试这个:

for (int i=0; article[i] != '\0'; ++i) {
  tempArticle[i] = article[i];
}

您的代码中还存在其他设计问题,但这可能是唯一阻止其工作的问题。