在 strcpy 函数中使用指针作为参数。试图从书中理解代码

Usage of pointers as parameters in the strcpy function. Trying to understand code from book

来自我的书:

void strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’[=10=]’)
++i;
}

我正在尝试从我的课本中理解这段代码。它们没有提供主要功能,所以我试图思考如何在函数调用中使用参数。据我了解,字符串 t[ ] 中字符的 "i-number" 被复制到字符串 s[ ] 中,直到从 \0 转义序列中不再有字符可读。我真的不明白如何在函数之外定义参数。任何帮助是极大的赞赏。谢谢你。

这里要记住两件事:

  • C 中的字符串是 chars
  • 的数组
  • 数组作为指针传递给函数

所以你可以这样称呼它:

char destination[16];
char source[] = "Hello world!";

strcpy(destination, source);
printf("%s", destination);

i 只是一个内部变量,它在 strcpy 函数之外没有任何意义(它不是参数或任何东西)。此函数将整个字符串 t 复制到 s,并在它看到 [=16=] 字符(根据 C 约定标记字符串的结尾)时停止。

编辑:此外,strcpy 是标准库函数,因此如果您尝试重新定义它,可能会发生奇怪的事情。给你的副本一个新的名字,一切都会好起来的。

这是给你的主菜:

int main()
{
    char buf[30];
     strcpy(buf, "Hi!");
     puts(buf);
     strcpy(buf, "Hello there.");
     puts(buf);
}

st 的要点是接受程序中其他地方存在的字符数组。它们在别处定义,在这一层通常由直接调用者或上面的另一个调用者定义。它们的含义在运行时被替换。

你的编译有问题是因为你的书错了。应该阅读

const strcpy (char *s, const char *t)
{
     ...
     return s;
  }

其中const表示不会修改。因为 strcpy 是一个标准函数,所以您确实需要它是正确的。

以下是您可能如何使用该函数(注意您应该更改函数名称,因为它会与标准库冲突)

void my_strcpy (char *s, char *t)
{
    int i=0; 
    while ((s[i] = t[i]) != ’[=10=]’)
    ++i;
}

int main()
{
    char *dataToCopy = "This is the data to copy";
    char buffer[81];   // This buffer should be at least big enough to hold the data from the 
                       // source string (dataToCopy) plus 1 for the null terminator

    // call your strcpy function
    my_strcpy(buffer, dataToCopy);

    printf("%s", buffer);
}

在代码中,i 变量指向字符数组中的字符。因此,当 i 为 0 时,您指向 st 的第一个字符。 s[i] = t[i]将第 i 个字符从 t 复制到 s 的第 i 个字符。 C 中的这个赋值本身是一个表达式,returns 是被复制的字符,这使您可以将其与空终止符 0 进行比较,即。 (s[i] = t[i]) != ’[=19=]’表示字符串结束,如果复制的字符不是空终止符则循环继续,否则将结束。