在下初学c语言,最近看到这样一道题但是解答中的一段代码有些疑惑(其实看不懂)
如下
/
字符串链接
/
void link(char ch1,char ch2)
{
char ch[1000];
int i,j,k;
for(i = 0; ch1[i]!='\0';i++)
ch[i] = ch1[i];
for(k = 0;;i++,k++)
{
ch[i] = ch2[k];
if(ch2[k] == '\0')
break;
}
puts(ch);
}
int main()
{
char ch1[1000],ch2[1000];
gets(ch1);gets(ch2);
link(ch1,ch2);
return 0;
}
有没有大佬能帮忙解答一下,十分感谢!
什么地方不懂?
可以讲一下这两个循环吗?
突然间看懂了,第一个for是把ch1全部赋给ch,然后再从i+1开始把ch2赋给ch再输出对吧
你的代码贴错了吧。
void link(char ch1,char ch2)
应该是
void link(char* ch1,char* ch2)
参数是char数组首地址也就是指针
其次这个link
函数的功能实际上把ch1
char数组和ch2
char数组 合并到一起并输出。
第一个for循环复制ch1
部分到ch
中, 第二个for循环复制ch2
部分:注意那个i
1.首先从main函数来看,从键盘中获取两个字符串,长度最大都为1000个字节,在进行链接 的时候,保持这两个字符串的数组最大长度也是1000字节,这明显就是一个bug。试想一下,加入两个读入的字符串的长度和大于1000个字节的,那么保存链接数据的数组必定长度不足。
2.从连接的link程序看,赋值给ch数组的结束标志是遇到'\0',那么问题就是,这两个字符串加入都没有出现'\0'且长度和大于1000的时候,程序马上就会崩溃,因为数组越界了。
3.连接字符串的前提是这两个字符串中到底有有没有空的字符串,如果有一方是空字符串,那就简单直接输出非空字符串即可;如果两个字符串都为空,那就直接返回或者不输出即可;如果有数据,那必须控制数组的长度,简单一点的可以使用strlen和malloc,free函数来进行操作,确保有足够的空间容纳两个字符串。
博问支持markdown代码高亮,建议给代码加上高亮
– dudu 6年前@dudu: 高亮是啥?
– 14yang 6年前