1

我在将 char 指针指向的内容复制到另一个时遇到问题,即使我在使用strcpy之前为其分配了内存。我已经看到了一些关于strdup的建议,但我想知道在不需要它的情况下该怎么做。这是我的主要代码

int main (void)
{
    char word[20];
    leaftype destiny;
    while(1)
    {
        printf("\nType in a word: ");
        scanf("%s",word);
        copy_leaf(&destiny,palavra);
        if (palavra[0] == '0') break;
    }

    system("pause");

    return 0;
}

我遇到的问题是函数copy_leaf:

void copy_leaf(leaftype* destiny, leaftype source)
{
    printf("\n====start of copy_leaf======\n");
    int i;
    printf("strlen of source: %d",strlen(source));
    printf("\nsource: ");
    for(i = 0; i <= strlen(source); i++)
    {
        if(i == strlen(source))
        {
            printf("\\0");
        }
        else printf("%c-",source[i]);
    }
    *destiny = malloc((strlen(source)+1)*sizeof(char));
    strcpy(*destiny,source);
    printf("\nstrlen of destiny: %d",strlen(*destiny));
    printf("\ndestiny: ");
    for(i = 0; i <= strlen(*destiny); i++)
    {
        if(i == strlen(*destiny))
        {
        printf("\\0");
        }
        else printf("%c-",*destiny[i]);
    }
    printf("\n===end of copy_leaf======\n");
}

叶类型定义为:

typedef char* leaftype;

当我运行以“example”作为输入的代码时,我进入控制台:

Type in a word: 
====start of copy_leaf======
strlen of source: 7
source: e-x-a-m-p-l-e-\0
strlen of destiny: 7
destiny: e-

它崩溃了(“program.exe 已停止工作等”在 Windows 7 上)。我正在使用 devcpp,但我的文件以 C 扩展名命名。谁能帮我修复这个 char* 到 char* 内容副本?我需要一个函数来做到这一点,因为我需要在我的 C 文件中多次将一个字符串的内容复制到另一个字符串。提前致谢!

ps:我已经在copy_leaf函数中尝试过的(绝望的解决方案):

  • leaftype source更改为const leaftype source(那将是const char* source
  • 制作*destiny = strcpy(*destiny,source),因为 strcpy 返回一个指向目标字符串的指针
4

3 回答 3

4

你不应该使用*destiny[i],但你需要(*destiny)[i]在这一行中使用 like,

    else printf("%c-",(*destiny)[i]);

顺便说一句,命运是一个双指针,我不认为你真的需要一个双指针。

于 2013-10-01T20:11:12.453 回答
1
printf("%c-",*destiny[i]);

destiny是一个 char**,并且 [] 优先于 *。

因此,这被解释为:

printf("%c-",*(destiny[i]));

当你真正想要的时候:

printf("%c-", (*destiny)[i]);

即,当您实际上想要第一个(也是唯一的)指针的第 i 个元素时,您正在读取第 i 个指针的第一个元素。

于 2013-10-01T20:17:16.360 回答
0

为什么我喜欢这样?这些是以下要进行的更正。

 void copy_leaf(leaftype* destiny, leaftype source)

改成

void copy_leaf(leaftype destiny, leaftype source)

destiny = malloc((strlen(source)+1)*sizeof(char));

strcpy(destiny,source);


for(i = 0; i < strlen(destiny); i++)
    {
        printf("%c-",destiny[i]);


    }

顺便说一句,strcpy 的正确原型应该是源数据应该始终是 const char *。

于 2013-10-01T20:12:32.207 回答