错误在C中将1个字符串复制到另一个字符串

时间:2014-03-15 16:20:12

标签: c string copying

  • 我试图将1个字符串的内容复制到另一个字符串(a到b)。 我特意把第二根弦(b)小于第一根弦 一(a)。
  • 我将第一个的内容复制到第二个

    。我在他们两个上添加了WATCH。在Debug选项卡中,我发现了 复制原始字符串会被破坏,新的字符串也会被破坏 显示的大于其大小。

       #include<stdio.h>
       int main()
       {
     char a[10]="What?";
     char b[2];
     int i;
     for(i=0;i<6;i++)
     {
        b[i]=a[i];
     }
     printf("This is %s",a);
     printf("\n this is b now: ",b);
     return 0;
    

    }

  • 我已附上截图。我拿了一串= 10号A = “什么?”然后我拿了一个字符串b [2]

  • 复制后,我打印了a和b。我期待输出 ,a =“什么?” ,b =“WH”但输出正在变成其他东西。(见 截图)

为什么原始字符串会被破坏?指针是否已更改?但是我把它变成了一个不变的指针。它无法改变。

以下是我面临的问题的屏幕截图: https://www.dropbox.com/s/8xwxwb27qis8xww/sjpt.jpg

请帮助别人!!

3 个答案:

答案 0 :(得分:3)

  1. 您将6个字节复制到两个字节的数组中,基本上是调用undefined behavior
  2. 您正在将数组b传递给printf%s说明符需要null-terminated string,而b很可能不会在此时以空值终止,这是另一种未定义的行为。
  3. 此外,一个可以插入2个字节数组的以null结尾的字符串基本上只能有一个可打印字符,所以你不应该期望b为“WH”。最好的情况是,如果你修复了复制,它只能是“W”,因为第二个字符将是一个终止字节(\0)。如果你想要两个字符,要么将数组大小增加到3以允许空终止符,要么只是不使用C字符串并使用“%c%c”格式字符串打印出两个字节。

答案 1 :(得分:1)

你目前所做的事情非常不安全!它可能在Windows上出于一些荒谬的原因,但不要这样做!

C标准库具有处理字符串和内存的特殊功能,strcpy例如用于复制字符数组。我建议您了解有关字符串如何工作以及如何操作它们的更多信息。

答案 2 :(得分:1)

正如其他答案所指出的那样,你是在数组范围之外写的。原始字符串a会发生变化,因为它恰好位于内存中的b之后,如调试窗口中所示。

在循环之前,内存如下所示:

 b  a
|00|WHat?00000|

循环之后,内存如下所示:

 b  a
|WH|at?0?00000|

这解释了为什么

  • a已更改
  • a中的原始问号仍在那里(你只写了6个字符 - 两个进入为b保留的位置,4个(包括空终结符)到a的位置)

当然这是Vlad Lazarenko已经提到过的未定义行为,但它解释了编译器/ settings / version / etc的行为。

只有编译器才存在常量指针。它确保您无法显式操作其数据,但如果您有内存泄漏,则无法保证任何内容。