strcat的不良行为

时间:2014-12-18 10:08:22

标签: c variables parameters parameter-passing strcat

我实现了以下功能以复制目录。

int copy_dir(char *source, char *destination, char *file_name)
{
    DIR *dir_ptr = NULL;
    struct dirent *direntp;
    char temp_dest[strlen(destination)+1];
    char temp_src[strlen(source)+1];
    strcat(destination, "/");
    strcat(source, "/");
    strcpy(temp_dest, destination);
    strcpy(temp_src, source);

    ...

    if( (dir_ptr = opendir(source)) == NULL )
    {
        fprintf(stderr, "Cannot open %s for copying\n", source);
        return ERR_OPEN_DIR;
    }
    else
    {
        while(direntp = readdir(dir_ptr))
        {     
            // File must already be on the USB key
            if(strcmp(direntp->d_name,file_name) == 0)
            {               
                strcat(temp_dest, direntp->d_name);
                printf("after strcat temp_dest=%s\n", temp_dest);         
                strcat(temp_src, direntp->d_name);
                printf("after strcat temp_src=%s\n", temp_src); 
                printf("destination:%s\n",temp_dest);
                copy_files(temp_src, temp_dest); 
            }
        }
    }
    closedir(dir_ptr);
    return 1;
} 

我想了解为什么以下实施

strcat(temp_dest, direntp->d_name);
printf("after strcat temp_dest=%s\n", temp_dest);         
strcat(temp_src, direntp->d_name);
printf("after strcat temp_src=%s\n", temp_src); 
printf("destination:%s\n",temp_dest);
copy_files(temp_src,temp_dest);

返回:

after strcat temp_dest=/tmp/usb/test10
after strcat temp_src=/media/sda1/test10
destination:10

为什么10通过最后一个printf返回/ tmp / usb / test10?

1 个答案:

答案 0 :(得分:1)

以下是您的主要问题,首先您不应修改char *sourcechar *destination,因为您不知道是否有足够的空间来追加字符,strcat不会为你分配,但最重要的错误就是这个

首先声明这些数组保存strlen(string) + 1个字符,这实际上意味着你只能将相同的字符串复制到它们中,因为你需要一个额外的字符用于终止'\0'字节,而不是由strlen

char temp_dest[strlen(destination)+1];
char temp_src[strlen(source)+1];

然后你再向字符串添加一个字符,strlen不计算这个字符,所以现在字符串不适合你的数组,而且,你不知道destination和{ {1}}有足够的空间容纳一个角色。

source

最后复制字符串

strcat(destination, "/");
strcat(source, "/");

我建议你这样做

strcpy(temp_dest, destination);
strcpy(temp_src, source);