Ubuntu / Windows中的输出不同

时间:2014-12-29 14:46:06

标签: c windows ubuntu

在这个程序中:

char ** change_first(char string1[]){

    int len_string = strlen(string1);

    char string2[len_string];

    strncpy(string2,string1,len_string);

    string2[0] = 'h';

    char **array_string = malloc(sizeof(char *) * 2);
    if (!array_string)
        return NULL;
    int i;
    for (i = 0; i < 2; i++) {
        array_string[i] = malloc(len_string + 1);
        if (!array_string[i]) {
            free (array_string);
            return NULL;
        }
    }

    strncpy(array_string[0],string1,len_string);
    strncpy(array_string[1],string2,len_string);

    return array_string;
}

 int main(){
    char string[] = "Hello World!";
    char **res = change_first(string);

    printf("%s",res[0]);
    printf("%s",res[1]);

    free(res[0]);
    free(res[1]);
    free(res);

    return 0;
}

Windows输出:

c:\VB\C\>cc -Wall -g test.c -o test

c:\VB\C>test
Hello World!n FiHAÏ!¶P
hello World!es(xàA┘ݶP

在Ubuntu上:

VB@VB-VirtualBox:~/Desktop/C$ make test
cc -Wall    -g    test.c   -o test
VB@VB-VirtualBox:~/Desktop/C$ ./test
Hello World!
hello World!

为什么Windows会打印额外的字符?我该如何解决这个问题?

在Windows 7 Ultimate 64位上运行。 Virtual Box运行Ubuntu 14.10。

1 个答案:

答案 0 :(得分:2)

这里有问题

char string2[len_string];

将其更改为

char string2[1 + len_string];

你没有打算终止'\0'

这是来自linux手册页的引用

  

警告:如果src的前n个字节中没有空字节,则放在dest中的字符串将不会以空值终止。