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);
  }

给出操作:

   King Rex
   Magnificent King Rex

同时删除第 2 行和第 3 行中的注释行并在第 7 行和第 8 行添加注释给了我:

      crmkrchile
      Magnificent King Rex

我只想知道为什么以及如何产生差异?提前致谢

4

2 回答 2

2
char f[]="Magnificent";

使数组f足够大以容纳 string "Magnificent",包括 0 终止符。

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

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

如果您声明的数组足够大以容纳连接的结果,

char f[32] = "Magnificent";

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

于 2013-04-24T18:34:25.127 回答
0

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

现在在您的示例中,您只是“幸运”了 f[] 和 n[] 恰好在内存中彼此相邻,因此当您用空格替换终止 null 时,它似乎是一个连接字符串.

于 2013-04-24T18:37:01.537 回答