【问题标题】:C language wrong output of memove() function?memove() 函数的 C 语言输出错误?
【发布时间】:2019-01-13 10:30:48
【问题描述】:

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

#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
根据memmove()函数的定义是对的,即从其第二个参数指向的对象中复制指定数量的字节到其第一个参数指向的对象中。(使用相同的字符串)这里的对象也是指到一个数据块。

【问题讨论】:

  • "这不应该是:我住在纽约市吗??"" 不。如何将“我住”部分移到字符串的末尾?
  • 我认为你书中的例子不是很好,因为你看不出第一个“家”消失了,第二个“家”被复制了。
  • @molbdnilo 是的,定义不是那么简单和令人困惑的例子让我理解错误这个函数。无论如何,它是 H.M.Deitel 的 C How To program 第 4 版
  • 说到书,你们可以推荐一些 C++ 的书吗?不适合初学者,也不适合高级程序员。 Smth 之间,有更多的例子和实践练习。我的请求的关键字是 PRACTICE、GOOD PRACTICAL Examples、PLAIN ENGLISH。
  • @Stanley 推荐的“半官方”stackoverflow C++ 书籍是here

标签: c arrays memmove


【解决方案1】:

我认为您有一个错误的印象,即 memmove 应该以某种方式交换目标和源的非重叠部分。这不是它的工作方式。您可能会混淆书中的示例,因为“家”一词出现了两次。将其更改为“Home Sweet HOME”,这样您就可以看到发生了什么,然后阅读memmove 的文档/规范,而不是猜测它的作用。

【讨论】:

    【解决方案2】:

    你的期望是错误的。

    你定义一个字符串:

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

    然后你从字符串的末尾移动(复制)10个字节:

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

    其他一切都没有触及。

    【讨论】:

    • 现在我明白了,它有点涵盖从 str[0] 到 str[9],从 str[7] 开始有 10 个字节。这个视觉解释是最好的!
    • +1 这个答案在 OP 层面比我写的简短的解释更好。
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多