微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

strcpy和自定义函数中的字符串都发生了什么?

如何解决strcpy和自定义函数中的字符串都发生了什么?

我最近使用的字符串函数一直很好。因此,我做了第三个字符串函数,基本上就像strcpy()

#include <stdio.h>
#include <string.h>

const char *copy_str(const char *str);

int main() {
    char name[256];
    printf("What's your name? "); scanf("%255s",name);
    char result[256] = copy_str(name);
    printf("Hello,%s.\n",result);
}

const char *copy_str(const char *str) {
    return str;
}

我没有在自己编写的函数中尝试使用strcpy()函数本身,因为我对此并不十分熟悉。然后我得到一个错误

copy_str.c:9:10: error: array initializer must be an initializer list or string literal
    char result[256] = copy_str(name);
         ^

我通过以下方式解决了该问题:

int main() {
    char name[256];
    printf("What's your name? "); scanf("%255s",name);
    char result[256];
    strcpy(name,result);
    printf("Hello,result);
}

但是输出结果如下:

What's your name? builderman
Hello,.

由于某种原因没有字符串。即使您输入了不同的字符串,结果也将相同。

问:为什么strcpy()毁了我的琴弦?有什么方法可以改善我的功能

解决方法

我将尝试部分回答您的问题。

  1. copy_str.c:9:10:错误:数组初始化程序必须是初始化程序列表或字符串文字

    字符结果[256] = copy_str(name);

此错误的意思是,在C语法中,您无法像以前那样初始化数组。 您只能使用以下任意一种文字来初始化字符数组:

char name[] = "Hello";

或类似的初始化列表:

char name[] = {'H','e','l','o'};

您无法使用指向char(这是函数的返回值)的指针来初始化数组

  1. strcpy不会神奇地将整个字符串复制到另一个字符串,而是对字符串进行迭代直到找到NULL终止符'\ 0' 因此,strcpy的简单实现可以是:

    char *StrCpy(char *dest,const char *src)
    {
     char *returned_str = dest;
    
     while (*src != '\0')
     {
        *dest = *src;
        src++;
        dest++;
     }
     *dest = '\0';
    
     return returned_str;
    }
    

因此strcpy遍历字符串并将每个字符从dest复制到src。 发送在数组末尾没有空终止符的字符数组时,可能会出现问题,这就是字符串应以C结尾的方式。

,

函数strcpy具有以下声明

char *strcpy(char * restrict s1,const char * restrict s2);

这是第一个参数,用于定义第二个参数指向的字符串要复制到的数组。

但是在您的程序中

int main() {
    char name[256];
    printf("What's your name? "); scanf("%255s",name);
    char result[256];
    strcpy(name,result);
    printf("Hello,%s.\n",result);
}

您要将未初始化的字符数组result复制到数组name中。

你必须写

    strcpy( result,name );

代替

    strcpy(name,result);

对于第一个程序,功能copy_str是多余的。你可以写

char result[256] = name;

但是,由于数组隐式转换为指向其第一个元素的指针,因此初始化方法的类型为char *。因此,这样的数组初始化是不正确的。您可以使用字符串文字(如

)初始化字符数组
char s[] = "Hello";

但是您不能使用字符指针来初始化字符数组,例如

char t[] = "Hello";
char s[] = t;

您的函数copy_str的外观可能如下

char * copy_str( char *dsn,const char *src )
{
    for ( char *p = dsn; ( *p++ = *src++ ); );

    return dsn;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。