我正在努力实现

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.任何帮助将不胜感激!

有帮助吗?

解决方案

始终是一种良好的做法,要注意错误消息,尤其是第一条消息(其他人通常是第一个错误的后果)。错误消息肯定会指示与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);
.

引入一个新变量,但具有相同的名称。

其他提示

程序将看出以下方式

#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;
}
.

更改

char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
.

char *mess = "hello world";
char *aess = malloc(strlen(mess) + 1);
.

mess是一个字符串文字,它在只读存储器中保持。您正在覆盖它并丢失您想要复制的字符串。您需要为您想要复制字符的位置,为您想要复制某些空间,在您的案例属生成icotagcode变量中。此外,请记住程序结束时的生成扫描码。如果没有,您将获得内存泄漏。

你为什么要声明和定义 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;

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top