我使用以下代码将字符串内容复制到另一个字符串。 使用两个逻辑,一个用while循环(注释)工作,另一个不用(as = at)。
请帮我识别此代码中的缺陷。
提前致谢
#include<stdio.h>
#include<conio.h>
main()
{
char *s="SourceString";
char *t="TargetString";
void print(char *s);
void strcopy(char *s,const char *t);
print(s);
strcopy(s,t);
print(s);
getch();
}
void strcopy(char *as,const char *at)
{
/*while((*as=*at)!='\0') // working
{
as++;
at++;
} */
as=at; //not working
}
void print(char *s)
{
printf("\n Printing the Contents:");
for(;*s!='\0';s++)
printf("%c",*s);
printf("\n END");
}
所有人都说这些字符串是通过Value传递的,而不是通过地址传递的。 但是我使用指针在调用函数am中调用函数的字符串的地址。 请澄清我是新手指针
答案 0 :(得分:2)
当as
是函数参数时,写入as=anything;
在函数终止时不再有效,因为它的参数不再存在(以及它的局部变量)。你没有修改字符串,你只是修改了一个临时包含字符串地址的内存单元格,而且无论如何它都会被释放。
你的问题确实是关于指针的问题。也许你可以在StackOverflow上找到一个已经问过的关于C或C ++指针的问题。
答案 1 :(得分:2)
分配如下字符串:
char *s="SourceString";
正在使用只读内存,因此修改内容将导致未定义的行为。使用数组可能会像你想象的那样工作。
char s[]="SourceString";
char t[]="TargetString";
在你的例子中,你只是在玩strcpy函数返回时被破坏的局部变量。
您可以尝试这样的事情:
void strcopy2(char **s, char **t) //<--- pointers to pointers, ouch!
{
*t = *s; //<--- Assign the value of the pointer who's address was passed.
}
int main(void)
{
char *s = "SourceString";
char *t = "TargetString";
printf("%s\n", s);
strcopy2(&s, &t); //<--- pass address of pointers!
printf("%s\n", t);
}
我喜欢使用char数组,但如果我正在操作字符串。
答案 2 :(得分:1)
有效版本使用循环一次复制一个字符。
不只是将一个指针变量复制到另一个指针变量的版本。此操作不会影响程序中的任何其他操作。 as = at
只修改一个局部变量并返回。因此,这不是您可以进行的优化。
答案 3 :(得分:0)
使用as=at;
将局部变量复制到局部变量中。不要紧,它们是指针 - 它们是函数堆栈上的副本,因此在函数外部看不到您的更改。
答案 4 :(得分:0)
以下是您的非工作代码的两个错误。
1)您的声明 as = at 将局部变量复制到另一个本地变量。离开功能后,分配将丢失 2)你可能正在泄漏指向
之前指定的使用中的另一个潜在问题是,通常在C中我们说 target&lt; - source ,因此 和 的使用情况看起来如此向后。