使用C操纵指针

Ben*_*nMN 2 c memory pointers allocation

在使用C中的指针时,我遇到了一个非常不稳定的结果,我正在使用一个令牌,这是一个字节字符串,我需要创建一个目录路径.令牌包含日期作为前缀,格式为20101129(2010-oct-29),然后是一个20字节的字符串,因此一个令牌看起来像20101102A2D8B328CX9RDTBDE373,该方法应该返回一个看起来像2010/11的路径/ 02/A2D8/B328/CX9R/DTBD/E373.

现在使用我在下面提供的代码中使用的方法,返回具有不需要的字符的字符串,同时代码看起来正常,代码在下面提供

#include <stdio.h>  
#include <string.h>  
#include <unistd.h>  
#include <stdlib.h> 

#define token "20101102A2D8B328CX9RDTBDE373"
#define SLASH "/"

int main()
{
    char *mainstring = (char*)malloc(strlen(token));
    char *nextstring = (char*)malloc(strlen(token));
    char tokenarr[50] = token;
    char patharr[50];
    char pathmem[50];
    char *fullstring = (char*)malloc(strlen(token));

    char yrstr[4]="";
    char yrmem[4]="";
    char yrarr[4]="";

    char monstr[2]="";
    char monmem[2]="";
    char monarr[2]="";

    char daystr[2]="";
    char daymem[2]="";
    char dayarr[2]="";

    memcpy(mainstring,token,strlen(token));


    memcpy(yrarr,tokenarr,4);
    strncpy(yrstr,mainstring,4);
    memcpy(yrmem,mainstring,4);

    puts(yrarr);
    puts(yrstr);
    puts(yrmem);


    mainstring = mainstring +4;
    memcpy(monarr,tokenarr+4,2);
    strncpy(monstr,mainstring,2); 
    memcpy(monmem,mainstring,2);

    puts(monarr);    
    puts(monstr); 
    puts(monmem);    

    mainstring = mainstring+2;
    memcpy(dayarr,tokenarr+6,2);
    strncpy(daystr,mainstring,2);
    memcpy(daymem, mainstring,2);

    puts(dayarr);
    puts(daystr);
    puts(daymem);

    strcat(patharr,yrarr); strcat(pathmem,yrmem);
    strcat(patharr,"/"); strcat(pathmem,SLASH);
    strcat(patharr,monarr);strcat(pathmem,monmem);
    strcat(patharr,"/"); strcat(pathmem,SLASH);
    strcat(patharr,dayarr); strcat(pathmem,daymem);

    puts(patharr);
    puts(pathmem);

    mainstring = mainstring +2;
    int i;

    for(i=0;i<5;i++)
    {
        memcpy(nextstring,mainstring,4);
        mainstring = mainstring +4;
        printf("The %d th string is:",i+1);        
        puts(nextstring); strcat(fullstring,"/");
        strcat(fullstring, nextstring);

        puts(fullstring);
    }
    strcat(patharr,fullstring); 
    strcat(pathmem,fullstring);
    puts(patharr);
    puts(pathmem);


return 0;

}
Run Code Online (Sandbox Code Playgroud)

代码的结果是:

2010
2010
2010
11
11米
11
02米
02
02
2010/11 /02米
米2010/11/02
是第1串是:A2D8
/ A2D8
的2个字符串是:B328
/ A2D8/B328
这是第3串是:CX9R
/ A2D8/B328/CX9R
第4个字符串是:DTBD
/ A2D8/B328/CX9R/DTBD
第5个字符串是:E373
/ A2D8/B328/CX9R/DTBD/E373
2010/11/02m/A2D8/B328/CX9R/DTBD /E373 m 2010/ 11/02/
A2D8/B328/CX9R/DTBD/E373

我的主要问题是,为什么字符包含在结果字符串中?我用指针做错了什么?

Oli*_*rth 7

strlen返回字符串的长度,不包括NULL终止符; 因此memcpy不会复制它,因此结果字符串不会终止.这同样适用于你malloc的.

您需要使用strlen() + 1或使用strcpy().