尝试在C中创建一个将一个字符串复制到另一个字符串的函数

时间:2017-04-14 18:54:02

标签: c string function

我必须创建一个接受两个字符串指针作为参数的函数 - 一个具有内容,一个为空,并将第一个的内容复制到第二个。

我该怎么做呢?这是我的代码,但它在运行时崩溃:

#include <stdio.h>

void strcopy1(char* mainStr[], char* emptyStr[], int size)
{
   for(int i = 0; i < size; i++)
   {
       *emptyStr[i] = *mainStr[i];   //The issue is on this line. How do I do this?
   }
}

int main(void)
{
    char *s1 = "Barrel";
    char *e1;
    printf("mainStr is: %s\n", s1);
    printf("emptyStr is: %s\n", e1);
    strcopy1(&s1, &e1, 7);
    printf("mainStr is: %s\n", s1);
    printf("emptyStr is: %s\n", e1);
}

提前致谢。

4 个答案:

答案 0 :(得分:3)

几个问题:

  1. 您没有为目标字符串分配空间。
  2. 您不需要将指针传递给变量,只需传递指针变量本身。
  3. 在调用函数之前无法打印空字符串,因为您尚未初始化其任何内容。
  4. 数组的元素为char,而不是指向char的指针,因此您无需使用*mainStr[i]*emptyStr[i]
  5. 代码:

    #include <stdio.h>
    
    void strcopy1(char mainStr[], char emptyStr[], int size)
    {
       for(int i = 0; i < size; i++)
       {
           emptyStr[i] = mainStr[i];
       }
    }
    
    int main(void)
    {
        char *s1 = "Barrel";
        size_t len = strlen(s1) + 1; // Add 1 for the trailing null byte
        char *e1 = malloc(len);
        printf("mainStr is: %s\n", s1);
        strcopy1(s1, e1, len);
        printf("mainStr is: %s\n", s1);
        printf("emptyStr is: %s\n", e1);
        free(e1); // Always free dynamically-allocated memory
    }
    

答案 1 :(得分:0)

我认为问题在于您调用函数的行。我找到了一个适合你的解决方案。

copy_string(char *target, char *source)
{
    while(*source)
    {
        *target = *source;        
        source++;        
        target++;
    }    
    *target = '\0';
}

这个功能可以帮到你。

答案 2 :(得分:0)

以下是您的代码,其中更正了内联注释:

// pointer to pointer is not needed, change argument to char *
//void strcopy1(char* mainStr[], char* emptyStr[], int size)
void strcopy1(char* mainStr, char* emptyStr, int size)
{
   for(int i = 0; i < size; i++)
   {
       //*emptyStr[i] = *mainStr[i];   //The issue is on this line. How do I do this?
       emptyStr[i] = mainStr[i]; //reference variable, not pointer to variable
   }
}

int main(void)
{
    char *s1 = "Barrel";
    char *e1 = {0};  // initialize variable
    e1 = malloc(strlen(s1)+1); //allocate memory to target string (+1 for NULL)
    if(e1)//ensure e1 memory was created
    {
       printf("mainStr is: %s\n", s1);
       printf("emptyStr is: %s\n", e1);
       strcopy1(s1, e1, 7); //string variables are already pointers
                         //no need for the "address of" operator
       printf("mainStr is: %s\n", s1);
       printf("emptyStr is: %s\n", e1);
       free(e1); //always free memory when explicitly created using malloc()
    }   

    return 0;//add return to match your 'main' prototype
}

在评论中回答你的问题: 将e1行更改为“char * e1 [7];”或“char e1 =”“;并删除&符号,它仍然会崩溃。

1)将char *e1更改为char *e1[7]正在创建char *[7],但您需要char *char [7]作业。要么创建足以用作作为参数传递的C字符串的容器。 (但char *需要在使用前分配内存([m][c]alloc

2)关于去除&符号,上面也解释了这一点,但基本上,&是运算符的地址,因为C string names (变量)已经指向了字符串的地址,不需要&运算符。

答案 3 :(得分:0)

首先,你试图显示一个非初始化的字符串,这是不可能的。 其次,我不明白为什么参数是一个指针数组。 这就是我的建议:

void strcopy1(char *mainStr, char *emptyStr) {
   while (*mainStr) {
      *emptyStr = *mainStr;
       mainStr++;
       emptyStr++;
    }
  *emptyStr = '\0';
 }

int main(void)
{
   char *s1 = "Barrel";
   char *e1;
   printf("mainStr is: %s\n", s1);
   strcopy1(&s1, &e1);
   printf("mainStr is: %s\n", s1);
   printf("emptyStr is: %s\n", e1);
}