C语言字符连接,但是不能直接用库函数strcat,新手,求指错误

#include<stdio.h>
#include<string.h>
int main()
{char a[85],b[80];
int m,n,i,k=0;
gets(a);
gets(b);
m=strlen(b);
n=strlen(a);
if(m>5) m=5;
for(i=n+1;i<n+m+1;i++)
{k++;
a[i]=b[k];
}
puts(a);
}
测试出错................

第1个回答  2013-10-29
把for(i=n+1;i<n+m+1;i++)改成for(i=n;i<n+m+1;i++)。

k++;
a[i]=b[k];次序倒一下,改成
a[i]=b[k];
k++;
余正确。追问

还有改的地方:i<m+n 最后再加上a[m+n]='\o'

追答

不用改!你改成i<m+n就少了一次循环,最后的'\0'就拷贝不过去了,所以才得在最后加一句a[m+n]='\o'。b[]中最后自动放置了'\0',用n+m+1次循环,刚好把它拷贝到a[]的最后,这不就得了?你完全是知其然,不知其所以然!被人牵着走还以为是最好。我都说“余正确”了,那不是白说的,怎么不执行一下试试?

追问

我试了,但是不确定.................

为什么会出现这种情况?

追答

对b[]输入超过5个字符时代码截取了5,就破坏了b[]最后的'\0'。应该在这里把b[]字符串修正(见代码1)。或者把a[]初始化一下(a[85]="")也能奏效(见代码2)。

代码1:

void main(void){

    char a[85],b[80];

    int m,n,i,k=0;

    gets(a);

    gets(b);

    m=strlen(b);

    n=strlen(a);

    if(m>5){

        m=5;

        b[m]='\0';

    }

    for(i=n;i<n+m+1;i++){

        a[i]=b[k];

        k++;

    }

    puts(a);

}

代码2:

void main(void){

char a[85]="",b[80];

    int m,n,i,k=0;

    gets(a);

    gets(b);

    m=strlen(b);

    n=strlen(a);

    if(m>5) m=5;

    for(i=n;i<n+m+1;i++){

        a[i]=b[k];

        k++;

    }

    puts(a);

}

追问

懂了!拜谢!唉,考虑问题还得细心啊!谢大神了!

追答

懂了就好啊……
不过按你的代码的意思,如下写法则更好些——
void main(void){
char a[85],b[80];
int m,n,i,k=0;
gets(a);
gets(b);
b[5]='\0';

m=strlen(b);
n=strlen(a);
for(i=n;i<n+m+1;i++){
a[i]=b[k];
k++;
}
puts(a);
}
这样就省掉了无谓的判断什么的。有点好为人师了,供参考……

第2个回答  2013-10-29
#include<stdio.h>
#include<string.h>
int main()
{char a[85],b[80];
 int m,n,i,k=0;
 gets(a);
 gets(b);
 m=strlen(b);
 n=strlen(a);
 //if(m>5) m=5;
 for(i=n;i<n+m;i++)//
    {
 a[i]=b[k++];//
    }
 a[i] = 0;//
 puts(a);
}

本回答被提问者采纳
相似回答