【问题标题】:concatenating strings using malloc使用 malloc 连接字符串
【发布时间】:2013-11-23 14:42:58
【问题描述】:

这是一个使用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 

连接字符串需要什么更正。当我在void main() 之后使用char string1[20],string2[20],*ptr; 时,

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

【问题讨论】:

  • strlen()的返回类型是size_t。使用size_t len1,len2,i,j,您会发现更大的便携性

标签: c arrays string pointers malloc


【解决方案1】:

第二个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(),以及臭名昭著的 &lt;conio.h&gt; 标头,不是标准 C 并且不可移植;在像这样的简单程序中避免使用它们。

【讨论】:

  • thanx...它现在可以工作了....如果不是clrscr()getch()&lt;conio.h&gt; 标题,那么哪些语句必须替换它们?
  • 如果我将字符串长度声明为 10 而不是 20,我会得到 output:enter string 1: i love ; enter string 2 : my india ; output string : i love m ....不起作用
  • @user4815162342 将gets() 替换为fgets(),虽然好主意有副作用:fgets() 保留了“\n”。 gets() 没有。更接近的选择是gets_s()
  • 而不是gets,我使用fgets(stdin, string1, sizeof(string1)); gives error1:type mismatch in parameter '_n' in call to 'fgets'; error 2:type mismatch in parameter '_n' in call to 'fgets'` 和使用gets_s 给出undefined symbol _gets_s
  • @chux 好点,我现在修改了答案以提及尾随换行符。 gets_s 只进入了 C11,并且在许多系统上仍然不可用 - 例如,我相当最新的 ArchLinux 没有 gets_s 的联机帮助页,也不存在于系统包含文件中。
【解决方案2】:

你可以更简单地使用strcat

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

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

strcat(string1,string2);

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

【讨论】:

  • 我知道strcat,但我想以这种方式完成。
  • 鉴于 OP 的 char string1[20],string2[20],“输入字符串 1:此程序执行”和“输入字符串 2:不给出输出”,建议的 strcat(string1,string2) 写在 string1[] 之外。
猜你喜欢
  • 2017-06-09
  • 2023-03-14
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 2020-03-15
  • 1970-01-01
  • 2016-10-25
相关资源
最近更新 更多