【问题标题】:Without null char in second argument for strcpy() function is returning unexpected result. Why?strcpy() 函数的第二个参数中没有空字符会返回意外结果。为什么?
【发布时间】:2018-10-25 01:58:59
【问题描述】:
#include<stdio.h>
#include <string.h>
int main()
{
    char a[5];
    char b[2]="12";
    strcpy(a,b);
    printf("%s\n",a);
}

字符串 b 中没有空字符,这就是输出不符合预期的原因。
输出:12@
为什么输出只是这样?

【问题讨论】:

    标签: string strcpy string.h


    【解决方案1】:

    您的程序有未定义的行为。

    您的数组b 包含{ '1', '2' }。正如你所说,数组中没有空字符——这意味着它不包含字符串。

    strcpy 的第二个参数必须是一个指向字符串的指针。你给了它一个char* 值,它不是指向字符串的指针。

    实际上,strcpy 可能会继续从内存中复制b 之后的字符。该内存包含任意垃圾 - 甚至访问它的尝试都有未定义的行为。

    从某种意义上说,你很幸运得到了明显垃圾的输出。如果在内存中的数组后面恰好有一个空字符,并且如果您的程序在尝试访问它时没有崩溃,它可能只是打印了12,而您可能不知道您的程序有错误.

    如果你想更正你的程序,你可以改变

    char b[2] = "12";
    

    char b[] = "12";
    

    编译器会计算出b 需要多大才能容纳字符串(包括所需的终止空字符)。

    【讨论】:

      【解决方案2】:

      strcpy 一直复制,直到遇到空字符(值为 0x00 的字节)。它会复制路上遇到的任何东西。在您的情况下,数组 b 之后的内存恰好包含一个值为 0x40 的字节('@'),然后是一个值为 0x00 的字节。

      【讨论】:

        猜你喜欢
        • 2017-12-25
        • 2021-01-16
        • 2022-08-18
        • 2016-05-21
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 2023-01-28
        • 2011-05-19
        相关资源
        最近更新 更多