2014-04-15 21 views
0

这是一个简单的程序,其中函数abc返回一个数组。但输出是结构返回字符数组打印值的两倍

Thanks 
abcdefThanks 

为什么这样?我想谢谢只能打印一次。 此外,我需要把a的大小定为6.在这个程序中,没关系,但我正在做原始套接字编程,我需要它。大小= 6在那里预定义的头文件中声明。我怎样才能实现它?

char *abc() 
{ 
    unsigned char *ch; 
    unsigned char a[7],c[6]; 
    strncpy(a,"Thanks",strlen("Thanks")); 
    strncpy(c,"abcdef",strlen("abcdef")); 
    ch=malloc(50); 
    memset(ch,0,50); 
    memcpy(ch,&a,strlen(a)); 
    memcpy(ch+strlen(a)+1,&c,strlen(c)); 
    return ch; 
} 
int main() 
{ 
    char *a; 
    a=abc(); 
    printf("\n%s\n",a); 
    printf("\n%s\n",(a+7)); 
    fflush(stdout); 
    return 0; 
} 

谢谢:)

+0

真的是你传出去把这样?因为'a'会打印'Thanks abcdef','a + 7'会打印'abcdef'。 –

回答

1

调用strlen(a)不停止你认为它应该因为没有零终结符和垃圾内存破坏你的结果。 的strlen(字符串)不包括零终止的计数

你还是请执行下列操作(看评论)

char *abc() 
{ 
    char *ch; 
    char a[7],c[7]; 
    strncpy(a,"Thanks",strlen("Thanks")); // Watch out, strlen(string) doesn't include null terminator 
    a[6] = '\0'; // Prevent garbage from uninitialized memory to pester your ch and strlen(a) 
    strncpy(c,"abcdef",strlen("abcdef")); 
    c[6] = '\0'; 
    ch=malloc(50); 
    memset(ch,0,50); 
    memcpy(ch,&a,strlen(a)); 
    memcpy(ch+strlen(a),&c,strlen(c)); // No -1 because you want to cut the terminator off 
    return ch; 
} 
int main() 
{ 
    char *a; 
    a=abc(); 
    printf("\n%s\n",a); 
    printf("\n%s\n",(a+7)); 
    fflush(stdout); 
    return 0; 
} 

以上编译使用C++,但它应该很很少有相同的调整。

这里是有记忆就像倾销,其中#是指垃圾

char *abc() 
{ 
    char *ch; 
    char a[7],c[7]; 
    strncpy(a,"Thanks",strlen("Thanks")); // Watch out, strlen(string) doesn't include null terminator 
    // a = "Thanks##################################.." 
    a[6] = '\0'; // Prevent garbage from uninitialized memory to pester your ch and strlen(a) 
    // a = "Thanks\0############################" 
    strncpy(c,"abcdef",strlen("abcdef")); 
    // c = "abcdef############################" 
    c[6] = '\0'; 
    // c = "abcdef\0############################" 
    ch=malloc(50); 
    // ch = "###############################" 
    memset(ch,0,50); 
    // ch = "000000000000000000000000000000" 
    memcpy(ch,&a,strlen(a)); 
    // ch = "Thanks000000000000000000000000" 
    memcpy(ch+strlen(a),&c,strlen(c)); // No -1 because you want to cut the terminator off 
    // ch = "Thanksabcdef00000000000000000" 
    return ch; 
} 
+2

[请不要在C]中输入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。 – unwind

+0

对不起,固定和+1 :) –

+0

@unwind很高兴看到您的评论。你一直在纠正每一个人。做得好!!谢谢:) – user3433848

0

你忘了零通过附加一个0字节终止您的字符串。

unsigned char a[7], c[7]; // 7 = 6+1 since "Thanks" and "abcdef" have 6 bytes 
strncpy (a, "Thanks", 6); 
a[6] = (char)0; 
strncpy (c, "abcdef", 6); 
c[6] = (char)0; 

您的c字符串太短而且没有明确的0结束。所以你的strlen(c)undefined behavior

+1

在我看来,'(char)0'是一种写作''\ 0''的奇怪方式。 – unwind