C语言memove()函数的输出错误?

时间:2018-08-06 12:48:32

标签: c arrays memmove

无法弄清楚为什么我从这段代码中得到了这个输出。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[] = "I live in NY city";

    printf("%s%s\n","The string in array str[] before invokihg the function memmove(): ",str);

    printf("%s%s\n","The string in array str[] before invokihg the function memmove(): ",memmove(str,&str[7],10));
        return 0;
}

我的输出是:in NY cityNY city
不是吗:in NY city i live

这是我书中类似的例子,很有意义。

#include<stdio.h>
#include<string.h>
int main()
{
    char x[] = "Home Sweet Home";

    printf("%s%s\n","The string in array x[] before invoking the function memmove(): ",x);

    printf("%s%s\n","The string in array x[] before invoking the function memmove(): ",memmove(x,&x[5],10));
        return 0;
}   

这里的输出是:Sweet Home Home
根据{{​​1}}函数的定义,这是正确的,也就是说,将指定数量的字节从其第二个参数所指向的对象复制到其第一个参数所指向的对象。(具有相同的字符串)这里指的是一块数据。

2 个答案:

答案 0 :(得分:8)

您的期望是错误的。

您定义一个字符串:

char str[] = "I live in NY city";

然后,您从字符串的末尾开始将10个字节移动(复制):

"I live in NY city\0";
 012345678901234567
       /        /
      /        /
     /        /
    /        /
   /        /
  /        /
"in NY cityNY city\0";

其他所有内容均未触及。

答案 1 :(得分:4)

我认为您误以为drl file应该以某种方式交换目标和源的非重叠部分。这不是它的工作方式。您可能会混淆书中的示例,因为单词“ Home”出现了两次。将其更改为“ Home Sweet HOME”,这样您可以查看正在发生的情况,然后阅读rule "302 case" when numberObject: NumberDetails(status==302) then numberObject.setResult(numberObject.getA()+numberObject.getB()); end 的文档/规范,而不用猜测它的作用。