这是一个使用malloc
连接字符串的程序
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
char *sconcat(char *ptr1,char *ptr2);
void main()
{
char string1[20],string2[20],*ptr;
clrscr();
printf("enter string 1: ");
gets(string1);
printf("enter string 2: ");
gets(string2);
ptr=sconcat(string1,string2);
printf("output string : %s",ptr);
getch();
}
char *sconcat(char *ptr1,char *ptr2)
{
int len1,len2,i,j;
char *ptr3;
len1=strlen(ptr1);
len2=strlen(ptr2);
ptr3=(char *)malloc((len1+len2+1)*sizeof(char));
for(i=0;ptr1[i]!=' ';i++)
ptr3[i]=ptr1[i];
j=i;i=0;
for(;ptr2[j]!=' ';j++,i++)
ptr3[j]=ptr2[i];
ptr3[j]=' ';
return(ptr3);
}
output:
enter string 1 : this program does
enter string 2 : not give output
output string : this program does
连接字符串需要进行哪些更正。当我在void main()
之后使用char string1[20],string2[20],*ptr;
时,
output:
enter string 1 : is this
enter string 2 : correct ?
output string : correct? ?
第二个for
循环中的测试不正确;它应该是ptr2[i] != ' '
而不是ptr2[j] != ' '
。
关于代码的几点备注:
- 不要强制转换
malloc
的返回值 - 根据定义,
sizeof(char)
是1,因此乘以sizeof(char)
只会使代码更难读取 - 将
sconcat
的参数声明为const char *
,因为它们不会修改接收到的字符串 malloc
可以返回NULL;您必须在程序中处理这种情况,例如显示错误消息并退出gets
是不安全的,如果用户输入的字符数超过分配的字符数,它将使程序崩溃。将gets(string)
替换为fgets(string, sizeof(string), stdin)
,并去掉后面的换行符clrscr()
和getch()
,以及臭名昭著的<conio.h>
报头,不是标准C,并且是不可移植的;在像这样的简单程序中避免它们
您可以更简单地使用strcat
printf("enter string 1: ");
gets(string1);
printf("enter string 2: ");
gets(string2);
strcat(string1,string2);
但是,它会更改string1
,因此您可能也想使用strcpy
(将string1
复制到另一个字符串,然后返回)。