我有这段代码:
//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
我只是想知道为什么以及如何产生差异?提前致谢
答案 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时,它似乎是串联的字符串。