功能调用的不同答案在不同的位置

时间:2013-04-24 18:30:30

标签: c arrays

我有这段代码:

//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 个答案:

答案 0 :(得分:2)

char f[]="Magnificent";

使数组f足够大以容纳字符串"Magnificent",包括0终结符。

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

愉快地在数组边界外写入,调用未定义的行为,显然在这种情况下会覆盖其他数组test

如果声明数组足够大以保存连接结果,

char f[32] = "Magnificent";

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

答案 1 :(得分:0)

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

现在在你的例子中,你只是“幸运”,f []和n []碰巧在内存中碰巧彼此相邻,所以当你用空格替换终止null时,它似乎是串联的字符串。