我正在尝试实施
void strcpyy(char *s, char *t){
while(*s++ = *t++){
}
}
这是K& R的一个例子。实施应该相当容易,但由于某种原因,目前我的情况并非如此。所以我有以下
int main(){
char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
每次运行程序时,每次使用-Wall
运行时,我都会收到大量错误。我认为要实现和使用strcpyy
,你必须使用malloc空间来复制字符串,一旦你这样做,你应该能够打印aess
,理论上应该包含mess
的副本{1}}。任何帮助将不胜感激!
答案 0 :(得分:0)
注意错误消息始终是一个好习惯,尤其是第一条消息(其他通常是第一个错误的后果)。错误消息肯定表明与malloc对应的行号,并且很可能告诉你那里有什么问题。
更正你的程序:
char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);
或完整的功能是:
int main(){
char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
问题在于您的行
char *mess = (char *) malloc(strlen(mess) + 1);
覆盖第一行
char *mess = "hello world";
和行
char *aess;
将变量保留为未分配状态。
编译错误是因为编译器无法在
之间进行选择char *mess = "hello world";
和
char *mess = (char *) malloc(strlen(mess) + 1);
引入一个新变量,但每个变量名称相同。
答案 1 :(得分:0)
该程序将采用以下方式
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strcpyy( char *s, const char *t )
{
while ( *s++ = *t++ );
}
int main( void )
{
char *t = "hello world";
char *s = ( char * )malloc( strlen( t ) + 1 );
strcpyy( s, t );
printf( "%s\n", s );
free( s );
return 0;
}
答案 2 :(得分:0)
更改
char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
到
char *mess = "hello world";
char *aess = malloc(strlen(mess) + 1);
mess
是一个字符串文字,保存在只读内存中。你正在覆盖它并丢失你想复制的字符串。在您的aess
变量中,您需要为要复制字符的位置指定一些空格。另外,请记住程序结束时的free(aess);
。如果没有,你会发生内存泄漏。
答案 3 :(得分:0)
为什么要两次声明和定义mess
?如果它们具有相同的范围,则永远不要声明两个具有相同名称的变量,这样做会使编译器混淆;
我建议像这样使用strdup
:
int main(){
char *mess = strdup("hello world");
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
或只是像这样的普通数组
int main(){
char mess[] = "hello world";
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}