【发布时间】:2011-05-02 10:14:46
【问题描述】:
在使用 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;
}
代码的结果是:
2010
2010
2010
11
11m��
11
02米
02
02
2010/11/02m
��m�� 2010 /11/02
第一个字符串是:A2D8
/A2D8
第二个字符串是:B328
/A2D8/B328
第三个字符串是: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
我的主要问题是,为什么字符会包含在结果字符串中?我做错了什么指针?
【问题讨论】:
-
只有一个变量指向 malloc() 返回的地址,然后修改该变量,这是一种非常糟糕的风格。为了安全起见,您应该计划在指针上调用 free() 并保持原始值不变。在开头复制主字符串指针,然后对其进行操作。
-
细节点:20101129 是 2010 年 11 月 29 日。
标签: c memory pointers allocation