在使用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个
11米
11个
02米
02
02
2010/11年/02米
m 2010/ 11/02 02
第1个字符串是:A2D8
/ A2D8
第二个字符串是:B328
/ A2D8 / B328
第3个字符串是:CX9R
/ A2D8 / B328 / CX9R
第四个字符串是: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
我的主要问题是,为什么字符包含在结果字符串中?我用指针做错了什么?
答案 0 :(得分:7)
strlen
返回字符串的长度,不包括NULL终止符;因此memcpy
不会复制它,因此结果字符串不会终止。这同样适用于您的malloc
。
您需要使用strlen() + 1
,或使用strcpy()
。
答案 1 :(得分:1)
C中的字符串以空字符('\0'
)终止。您正在使用的各种字符串(例如yrstr
)不足以包含此空字符,并且您不会在其中添加空字符。
例如,当你这样做时
strncpy(yrstr,mainstring,4);
没有空字符被添加到字符串中,因为如果目标字符串中没有足够的空间,strncpy
将省略空字符。您需要自己添加空字符,例如:
yrstr[4]='\0';
这要求yrstr
足够大,至少包含五个字符。
答案 2 :(得分:1)
如果您的目标是将“20101102A2D8B328CX9RDTBDE373”转换为“2010/11/02 / A2D8 / B328 / CX9R / DTBD / E373”,那么一种方法如下:
// source string YYYYMMDD<20-char token>
char *src = "20101102A2D8B328CX9RDTBDE373";
// destination string, alloc space for source + 7 slashes + 1 null terminator
char *dest = (char *)calloc(1, strlen(src) + 7 + 1);
// now copy elements of src to dest, inserting intermediate slashes
<your code here>
答案 3 :(得分:0)
感谢您的投入,结果现在已经保持一致。我要感谢所有参与并帮助我的人。我发布的代码包含了下一个学习者从中获取的所有输入。在这里:
#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));
patharr[50]='\0';
char yrstr[5];
char monstr[3];
char daystr[3];
yrstr[4] ='\0';
monstr[2]='\0';
daystr[2]='\0';
memcpy(mainstring,token,strlen(token)+1);
strncpy(yrstr,mainstring,4);
mainstring = mainstring +4;
strncpy(monstr,mainstring,2);
mainstring = mainstring+2;
strncpy(daystr,mainstring,2);
puts(yrstr);
puts(monstr);
puts(daystr);
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,SLASH);
strcat(fullstring, nextstring);
puts(fullstring);
}
return 0;
}
结果是:
2010
11
02
The 1 th string is:A2D8
2010/11/02/A2D8
The 2 th string is:B328
2010/11/02/A2D8/B328
The 3 th string is:CX9R
2010/11/02/A2D8/B328/CX9R
The 4 th string is:DTBD
2010/11/02/A2D8/B328/CX9R/DTBD
The 5 th string is:E373
2010/11/02/A2D8/B328/CX9R/DTBD/E373