C语言字符串串连函数程序运行结果有一点

int chuanlian(char s[20],char t[20])

{
int i=0,j,k;

i=strlen(s);
j=strlen(t);
for(k=0;k<j;k++)
s[i+k]=t[k];

s[i+k]='\0';

printf("串连结果是: \n");

puts(s);

楼主没有考虑源串s和t连接起来之后超出定义长度的问题,所以会有问题。我写了个简单的测试程序,其中main中的串a和b定义大小为20字节;但是调用chuanlian函数连接起来之后超过20字节,这时会出现内存覆盖错误,即连接后的新字符串会写到合法内存之外。问题就出在这里。
解决方法一是在定义时对字符数组的大小规定一个比较大的值,但这不是根本解决之道。另一个就是定义函数chuanlian时,在函数体内指定源串的最大长度,在连接t到s时对超出部分进行截断处理,如下的chuanlian2函数。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int chuanlian2(char s[20],char t[20], int maxlen)//修正后的字符串连接函数
{
int i=0,j,k;

i=strlen(s);
j=strlen(t);
for(k=0;(k<j)&&((i+k)<maxlen-1);k++)//增加了长度判断
s[i+k]=t[k];

s[i+k]='\0';
printf("串连结果是:%s \n", s);

return i+k;//新添加的函数返回值,为连接后字符串s的长度。

}

int chuanlian(char s[20],char t[20])//原来的字符串连接函数
{
int i=0,j,k;

i=strlen(s);
j=strlen(t);
for(k=0;k<j;k++)
s[i+k]=t[k];

s[i+k]='\0';

printf("串连结果是:%s \n", s);

return i+k;//新添加的函数返回值,为连接后字符串s的长度。

}
int main()
{
char a[20]={0};
char b[20]={0};
sprintf(a,"first one");
sprintf(b,"...second one");
//chuanlian(a, b); //把注释取消和下一行语句执行情况比较。
chuanlian2(a, b,20);
system("pause");
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-31
程序功能是把字符串传入函数。。然后由函数把所有字符串连接在一起。。。while(strcmp(fgets(aaa,BUFFER,stdin),"quit\\n")!=0) p[i++] = (C
第2个回答  2012-05-31
返回值不对