(编辑)

在C中更新和返回函数中的字符串时可能会产生误解.

我是一名学生,刚刚开始try 动态内存分配技术.最近,我被告知要编写一个字符串复制()函数,该函数类似于<string.h>下C中的strcpy()函数.

它应该有两个参数:char c1[],char c2[]. Momentarily, I am focusing on a constraint wherein the length of string c1 is lesser than the string c2.在这种情况下,我们将把较大的字符串复制到较小的字符串中.因此,很自然,它将不得不扩大前一根弦的尺寸.(I have defined a function len() which returns the length of the string. It's working fine)

代码:

char* copy(char c1[],char c2[])
{
    int i=0;
    int lc1=len(c1);
    int lc2=len(c2);
    if(lc1<lc2)
    {
                //are the following two lines allowed?
        c1=(char*) malloc(lc1*sizeof(char));
        c1=(char*) realloc(c1,lc2*sizeof(char));
        for(i=0;i<lc2;i++)
        {
            *(c1+i)=c2[i];
        }
        *(c1+lc2)='\0';
    }
    return c1;
}

*如果此代码有多个问题,我不会感到惊讶! * 我try 了如下测试:

#include <stdio.h>
#include <string.h>
#include "mystring.h"
main()
{
    int i;
    char s1[12],s2[12];
    gets(s1);
    gets(s2);
    printf("copy: %s",copy(s1,s2));
    printf("\ns1: %s",s1);
}

我得到了: output

我希望两个输出是相同的,即副本和S1的输出.碰巧的是,只有当我将其与调用一起打印时,才会起作用.当我打印S1时,我以为它会打印副本.

我哪里错了?我认为这与我正在处理的变量的范围有关,或者与指针和内存分配作为一个整体有关!

EDIT:个 我制作了一个替代函数xCopy:

char* xcopy(char c1[])
{
    int i=0;
    int lc1=len(c1);
    char* c2=(char*) malloc((lc1+1)*sizeof(char));
    for(i=0;i<lc1;i++)
    {
        *(c2+i)=c1[i];
    }
    *(c2+lc1)='\0';
    return c2;
}

I realised this function was not solving the actual problem.


谢谢你的帮助!!

推荐答案

函数copy没有意义.

对于初学者来说,参数c1所指向的数组不一定包含字符串.所以这条线

int lc1=len(c1);

调用未定义的行为.

即使指针c1所指向的数组包含字符串,所存储的字符串也可以比数组的大小小得多.所以这条线又一次

int lc1=len(c1);

使用以下IF语句

if(lc1<lc2)

这说不通.

还分配了两次内存

c1=(char*) malloc(lc1*sizeof(char));
c1=(char*) realloc(c1,lc2*sizeof(char));

是不安全的、多余的和低效的.

Actually the function does not copy the string pointed to by the pointer c2 in the destination array. Thus using the parameter c1 again 这说不通. Your function looks like POSIX function strdup if to remove the first senseless parameter.

您没有展示计算字符串长度的函数len是如何计算的,但它似乎不计算字符串的终止零字符.在这种情况下,您至少需要使用表达式( lc2 + 1 ) * sizeof( char )来分配内存,以便为终止零字符'\0'保留内存.否则,此语句

*(c1+lc2)='\0';

调用未定义的行为.

该函数的用户负责提供足够大的目标数组来存储源字符串.该函数不应分配任何内存.

通过与标准C函数strcpy类比,该函数可以如下所示

char * copy( char s1[], const char s2[] )
{
    for ( char *p = s1; ( *p++ = *s2++ ) != '\0'; );

    return s1;
}

请注意,函数gets是不安全的,不受C标准的支持.相反,请使用标准的C函数fgets.它可以用换行符'\n'追加字符串.

要删除它,您可以编写以下代码

c2[ strcspn( c2, "\n" ) ] = '\0';

C++相关问答推荐

理解C中的指针定义

当包含头文件时,gcc会发出隐式函数声明警告

返回一个包含数组的 struct

如何设置指针指向在函数中初始化的复合文字中的整数?

如何知道我是否从非阻塞套接字读取所有内容

为什么net/if.h在ifaddrs.h之前?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

如何在C中使printf不刷新标准输出?

限制不同类型的限定符

判断X宏的空性

为什么此共享库没有预期的依赖项?

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

将回调/基于事件的C API转换为非回调API

生产者消费者计数器意外输出的C代码

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

赋值两侧的后置增量,字符指针

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

OpenGL 中的非渐变 colored颜色 变化