问题:给定两个字符串,如果第二个字符串的实际长度小于5,则将第二个字符串整个链接到第一个字符串后面。否则,如果第二个字符串的实际长度大于5,则将第二个字符串的前5个字符连接到第一个字符串后面。
#include<stdio.h>
#include<stdlib.h>//void comopare(int a[],int n);
int main()
{
char str1[60],str2[60];
int i;
//gets(str1);
scanf("%s",str1);
//gets(str2);
scanf("%s",str2);
printf("%d %d\n",strlen(str1),strlen(str2));
if(strlen(str2)<=5)
{ for(i=0;i<strlen(str2);i++)//因为当把str2中的字符加到str1中,strlen(str1)的值改变了,strlen(str2)的值没有改变。所以这里会出错。
{
str1[i+strlen(str1)]=str2[i]; //所以在这个循环中,我们不能用strlen(str2)作为i的上限。 我们可以用两个变量保存最初的str1和str2的实际长度。
printf("%d %c $$$ %d %c\n",i, str2[i], i+strlen(str1), str1[i+strlen(str1)]); }
str1[i+strlen(str1)]='\0';
}
else
{ for(i=0;i<5;i++)
//str1[i+strlen(str1)]=str2[i];
//{
str1[i+strlen(str1)-1]=str2[i];
//printf("%d %c",i+strlen(str1), str1[i+strlen(str1)]); }
str1[i+strlen(str1)]='\0';
}
for(i=0;i<strlen(str1)+5;i++)
printf("%c",str1[i]);
printf("\n%s\n",str1);
system("pause");
return 0;
}
更改后的正确的程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char str1[60],str2[60];
int i,a,b;
gets(str1);
//scanf("%s",str1);
gets(str2);
//scanf("%s",str2);
a=strlen(str1);
b=strlen(str2);
printf("%d %d\n",a,b);
if(b<=5)
{
for(i=0;i<b;i++)
str1[i+a]=str2[i];
str1[i+a]='\0';
}
else
{
for(i=0;i<5;i++)
str1[i+a]=str2[i];
str1[i+a]='\0';
}
printf("%s\n",str1);
system("pause");
return 0;
}
运行结果:
hello
chinese
5 7
hellochine
Press any key to continue . . .
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c[]="\t\v\\\0will\n";
char b[]="\t\v\\\nwill\n\n\n";
//char a[5]="\t\v\\\nwill\n";
printf("%d\n",strlen(c));
printf("%d\n",strlen(b));
system("pause");
return 0;
}
strlen()遇到结束字符‘\0’停止,遇到'\n'不结束。
3
11
Press any key to continue . . .