使用malloc连接字符串

时间:2013-11-23 14:42:59

标签: c arrays string pointers malloc

这是一个使用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]!='\0';i++)
ptr3[i]=ptr1[i];

j=i;i=0;
for(;ptr2[j]!='\0';j++,i++)
ptr3[j]=ptr2[i];

ptr3[j]='\0';
return(ptr3);
}

output:
enter string 1 : this program does
enter string 2 : not give output
output string : this program does 

连接字符串需要进行哪些更正。我在char string1[20],string2[20],*ptr;之后使用void main()

output:
enter string 1 : is this 
enter string 2 : correct ?
output string : correct? ?

2 个答案:

答案 0 :(得分:4)

第二个for循环中的测试不正确;它应该是ptr2[i] != '\0',而不是ptr2[j] != '\0'

关于代码的几点评论:

  • Don't cast the return value of malloc.
  • 根据定义,
  • sizeof(char)为1,因此乘以sizeof(char)只会使代码难以阅读。
  • sconcat的参数声明为const char *,因为他们没有修改他们收到的字符串。
  • malloc可以返回NULL;你必须在你的程序中处理这种情况,例如通过显示错误消息并退出。
  • gets不安全,如果用户输入的字符多于分配的字符数,则会导致程序崩溃。将gets(string)替换为fgets(string, sizeof(string), stdin),并删除尾随换行符。
  • clrscr()getch()以及臭名昭着的<conio.h>标头不是标准C且不可移植;在像这样的简单程序中避免使用它们。

答案 1 :(得分:3)

您可以更简单地使用strcat

printf("enter string 1: ");
gets(string1);

printf("enter string 2: ");
gets(string2);

strcat(string1,string2);

然而,它会更改string1,因此您可能也想使用strcpy(将string1复制到另一个字符串,然后将其返回)。