c - strcpy 函数无法正常工作

标签 c arrays string strcpy strlen

请考虑以下代码。

#include<stdio.h>
#include<string.h>
void main()
{
    char a[6], b[6];

    strcpy(a,"rajeev");
    printf("print A:");
    for(int i=0;i<strlen(a);i++)
    {
         printf("%c",a[i]);
    }

    strcpy(b,a);
    printf("print B:");
    for(int i=0;i<strlen(b);i++)
    {
        printf("%c",b[i]);
    }

    printf("trying to print A again");
    for(int i=0;i<strlen(a);i++)
    {
        printf("%c",a[i]);
    }

在运行这个程序时,在“尝试再次打印 A”部分没有打印任何内容,strlen(a) 将为 0。这意味着源数组将为空。

你能帮我理解这背后的现象吗? 但是,将 a[6] 的声明更改为 char* a=malloc(6) 可以正常工作。

最佳答案

字符串文字 "rajeev" 的类型为 char[7]。也就是说它具有静态存储持续时间并存储为像

这样初始化的数组
char unnamed[] = { 'r', 'a', 'j', 'e', 'e', 'v', '\0' };

因此,如果您要使用函数 strcpy 将其内容复制为字符串,您需要在目标数组中提供足够的内存。例如

char a[7], b[7];

strcpy(a,"rajeev");
printf("print A:");
for ( size_t i = 0, n = strlen( a ); i < n; i++ )
{
     printf("%c",a[i]);
}

//... and so on

考虑到函数 strlen 对字符进行计数,直到遇到终止零。因此,如果字符数组不包含此字符,则函数的行为未定义。

关于c - strcpy 函数无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041402/

相关文章:

c++ - 警告 : format not a string literal and no format arguments

c - c 中的严格别名和数组

arrays - 要求数组是 Swift 协议(protocol)中的最小大小

arrays - R中的字符串数组组合

c - C 中的字符串格式 %*s

c++ - matlab 生成的 C 函数的用途未知

c - 如何在这两个函数上分配内存

c - C如何处理Buffer溢出?

string - 优化 F# 字符串连接

c - 我如何使用带有 c 字符串输入的 switch ?