2013-04-24 144 views
0

我有这样的代码:不同的答案

//function to delete the occurence of c in s 
void squeeze(char s[], int c) { 
    int i,j; 
    for(i=j=0;s[i]!='\0';i++) 
    if(s[i]!=c) 
     s[j++]=s[i]; 
    s[j]='\0'; 
} 

//function to concatenate string 
void strca(char c[],char b[]){ 
    int i,j; 
    i=j=0; 
    while(c[i]!='\0') 
    i++; 
    c[i++]=' '; 
    while((c[i++]=b[j++])!='\0') 
    ; 
} 

现在,当我调用的函数在main()

int main(void){ 
1 char test[]="carmakarchile"; 
2 //squeeze(test,'a'); 
3 //printf("%s\n",test); 
4 char f[]="Magnificent"; 
5 char n[]="King Rex"; 
6 strca(f,n); 
7 squeeze(test,'a'); 
8 printf("%s\n",test); 
9 printf("%s",f); 
    } 

给出了OP:

King Rex 
    Magnificent King Rex 

虽然删除评论在2和3号线,并把评论7和8号线给我:

 crmkrchile 
     Magnificent King Rex 

我只是想知道为什么和怎样的差别产生的?在此先感谢

回答

2
char f[]="Magnificent"; 

使得阵列f只是大到足以容纳字符串"Magnificent",包括0终止。

char n[]="King Rex"; 
strca(f,n); 

高兴地写入数组边界之外,调用未定义的行为,显然在这种情况下,覆盖你的其他阵列test

如果声明数组大到足以容纳串联的结果,

char f[32] = "Magnificent"; 

例如,一切都将正常工作。

+0

哦..我知道了..谢谢很多:) – ejjyrex 2013-04-24 18:42:02

0

你的连接函数写过c []数组。如果要连接字符串,则需要确保为两个字符串分配足够的内存(包括终止\0)。

现在在你的例子中,你只是幸运地认为f []和n []恰好在内存中彼此相邻,所以当你用空格替换终止null时,它似乎是一个串联的字符串。

相关问题