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

yrdbyhpb  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(115)

我最近做的字符串函数做得很好,所以我做了第三个字符串函数,基本上类似于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, %s.\n", result);
}

但结果是这样的:

What's your name? builderman
Hello, .

由于某种原因没有字符串。即使键入了不同的字符串,结果也是一样的。
问:为什么strcpy()会破坏我的字符串?我可以用什么方法来改进我的函数?

xkftehaa

xkftehaa1#

我将试着分几部分回答你的问题。
1.复制字符串c:9:10:错误:数组初始值设定项必须是初始值设定项列表或字符串文本
字符结果[256] =复制字符串(名称);
这个错误的意思是在C语法中你不能用你做过的方法初始化一个数组.你只能用一个象这样的文字初始化一个字符数组:

char name[] = "Hello";

或者是这样的初始化列表:

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

不能用指向char的指针初始化数组(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遍历字符串并将每个字符从src复制到dest。当发送一个字符数组时,如果数组末尾没有空终止符,可能会出现问题,而在C中字符串应该是这样终止的。

vsdwdz23

vsdwdz232#

函数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;
}

相关问题