我必须创建一个接受两个字符串指针作为参数的函数 - 一个具有内容,一个为空,并将第一个的内容复制到第二个。
我该怎么做呢?这是我的代码,但它在运行时崩溃:
#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);
}
提前致谢。
答案 0 :(得分:3)
几个问题:
char
,而不是指向char
的指针,因此您无需使用*mainStr[i]
或*emptyStr[i]
。代码:
#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);
}