在这个程序中:
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。
答案 0 :(得分:2)
这里有问题
char string2[len_string];
将其更改为
char string2[1 + len_string];
你没有打算终止'\0'
。
这是来自linux手册页的引用
警告:如果src的前n个字节中没有空字节,则放在dest中的字符串将不会以空值终止。