首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用STRCPY C

使用STRCPY C
EN

Stack Overflow用户
提问于 2014-02-13 16:28:31
回答 4查看 4.1K关注 0票数 2

I代码:

代码语言:javascript
复制
#include<stdio.h>
#include<conio.h>
#include<string.h>

void main()
{
    char string[]="stackflow";
    strcpy(&string[0],&string[1]);
    puts(string);
    getch();
}

结果是“粘流”。我不明白这件事。你能解释谁?提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-13 16:37:00

调用strcpy(&string[0],&string[1]);的意思是:将以string1地址开始的以空结尾的字符串复制到字符串的地址。这意味着您要将从偏移量1 (tackflow)开始的字符串复制到偏移量0的地址。或者换一种方式:将字符串一个字符向左移动,覆盖s

strcpy用于将由空字节(C字符串)终止的字节数组从一个地址(第二个参数)复制到另一个地址(第一个参数)。通常,它用于将字符串从一个内存位置复制到一个完全不同的内存位置:

代码语言:javascript
复制
char string[] = "stackflow";
char copied_string[10]; // length of "stackflow" + NULL byte

strcpy(copied_string, string);
puts(copied_string);

正如@PascalCuoq正确指出的那样,您的调用是未定义的行为,这意味着任何事情都可能发生。The 标准说

如果复制发生在重叠的对象之间,则行为是未定义的。

所以你很幸运,你有一个“理智的”输出。

票数 9
EN

Stack Overflow用户

发布于 2014-02-13 16:47:08

需要注意的一点是:strcpy的行为是未定义的(请参阅C99 7.23.2.3:2),因此,无论输出是什么样子,您正在做的事情基本上不能保证工作,除非C实现的文档声明不同。

在字符串中移动数据时使用memmove

在声明字符串时,您也应该非常小心。您提供的代码是正确的:

代码语言:javascript
复制
char string[] = "foo";

string是一个字符数组,初始化为包含四个元素:'f‘、'o’、'o‘、'\0’。

但是,非常类似的代码是不正确的:

代码语言:javascript
复制
char * string = "foo";

此代码所做的是初始化指向常量字符串文本"foo“地址的指针。正确的版本是:

代码语言:javascript
复制
const char * string = "foo";

如果您试图修改这样的字符串,编译器将正确地抱怨。

票数 3
EN

Stack Overflow用户

发布于 2014-02-13 16:30:18

strcpy是(Dest,Src)。源从位置1开始,然后转到字符串的末尾。它将按源指向的字符串复制到按目标指向的数组中,包括终止空字符(并在此点停止)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21759894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档