Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
strcpy()和自定义函数中的字符串都发生了什么变化?_C_Char_Copy_C Strings_Strcpy - Fatal编程技术网

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

strcpy()和自定义函数中的字符串都发生了什么变化?,c,char,copy,c-strings,strcpy,C,Char,Copy,C Strings,Strcpy,我最近做的字符串函数做得很好。然后,我制作了第三个字符串函数,基本上类似于strcpy(): 我这样做: int main() { char name[256]; printf("What's your name? "); scanf("%255s", name); char result[256]; strcpy(name, result); printf("Hello, %s.\n", res

我最近做的字符串函数做得很好。然后,我制作了第三个字符串函数,基本上类似于strcpy():

我这样做:

int main() {
    char name[256];
    printf("What's your name? "); scanf("%255s", name);
    char result[256];
    strcpy(name, result);
    printf("Hello, %s.\n", result);
}
但结果是这样的:

What's your name? builderman
Hello, .
因为某种原因没有字符串。即使键入不同的字符串,结果也会相同


问:为什么
strcpy()
毁了我的字符串?我可以用什么方法改进我的功能?

我将试着分部分回答您的问题

  • copy_str.c:9:10:错误:数组初始值设定项必须是初始值设定项列表或字符串文字

    char result[256]=复制_str(名称)

  • 这个错误的意思是,在C语法中,不能像以前那样初始化数组。 只能使用如下所示的文本初始化字符数组:

    char name[] = "Hello";
    
    或者像这样的初始化列表:

    char name[] = {'H', 'e', 'l', 'l', 'o'};
    
    不能使用指向char(函数的返回值)的指针初始化数组

  • strcpy不会神奇地将整个字符串复制到另一个字符串,它会在该字符串上迭代,直到找到空终止符“\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);
    }
    
    您正在将未初始化的字符数组
    结果
    复制到数组
    名称

    你必须写作

        strcpy( result, name );
    
    而不是

        strcpy(name, result);
    
    对于第一个程序,则功能
    copy\u str
    是冗余的。你可以直接写

    char result[256] = name;
    
    但是,由于数组隐式转换为指向其第一个元素的指针,初始值设定项的类型为
    char*
    。因此,这样的数组初始化是不正确的。您可以使用字符串文字初始化字符数组,如

    char s[] = "Hello";
    
    但不能使用字符指针初始化字符数组,如

    char t[] = "Hello";
    char s[] = t;
    
    您的函数
    copy\u str
    可以如下所示

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

    char*strcpy(char*dest,const char*src)注意参数的顺序。
    字符结果[256]=复制\u str(名称)无法将指针分配给数组。你想这样说,
    constchar*result=copy\u str(name)
    
    char t[] = "Hello";
    char s[] = t;
    
    char * copy_str( char *dsn, const char *src )
    {
        for ( char *p = dsn; ( *p++ = *src++ ); );
    
        return dsn;
    }