【问题标题】:Concatenate two strings without using strcat不使用 strcat 连接两个字符串
【发布时间】:2020-06-28 14:00:40
【问题描述】:

我写了一个函数来连接两个字符串(s = "computer"; t = "keyboard"),但我的代码只返回"keyboard"。请指出错误。

char *concat(char *s, char *t) {
    s = malloc((strlen(s) + strlen(t) + 1) * sizeof(char));
    char *p = s;
    while (*p != '\0') {
        ++p;
    }
    while (*t != '\0') {
        *p++ = *t++;
    }
    *p = '\0';
    return s;
}

我不想使用strcat()。这是来自 Stepik 的测试程序,因此我无法更改 main 函数中的任何内容。 问题如下:编写一个函数,接收两个字符指针并返回一个表示它们连接的新字符指针。

【问题讨论】:

  • s = malloc(...) 会覆盖您传递的指针,因此输入字符串会丢失。然后,如果您在分配的内存中找到'\0',那是偶然的。
  • char *concat(const char *s, const char *t) { char *u = malloc(strlen(s) + strlen(t) + 1); if (u) sprintf(u, "%s%s", s, t); return u; }
  • 我讨厌原始问题的措辞(“这是问题:[...]”)。它将指针的值与它们指向的数据的值混为一谈,这正是给 C 学生带来麻烦的领域之一。课程材料未能在这些概念之间建立和保持明确的区别,从而损害使用它们的学生。
  • @pmg sprintf 连接两个字符串。可爱的。
  • 我更喜欢你的memcpy() 选项(顺便说一句),谢谢@P__J__

标签: c malloc string-concatenation


【解决方案1】:
char *myconcat(const char *s1, const char *s2)
{
    size_t len1,len2;
    char *result = malloc((len1 = strlen(s1)) + (len2 = strlen(s2)) + 1);

    if(result)
    {
        memcpy(result, s1, len1);
        memcpy(result + len1, s2, len2 + 1);
    }
    return result;
}

【讨论】:

  • 是的,帮学生做作业做得很好。至少有一些关于 OP 代码有什么问题的评论是有序的。
【解决方案2】:

当传递给一个函数时,你有 s="computer",然后在第一行你用 malloc 重新分配它,所以 "computer" 消失了。 您可以逐步调试程序,也可以将值打印到控制台。这将帮助您找到错误。

【讨论】:

    【解决方案3】:

    你在正确的轨道上:

    • 您分配了正确的内存量,
    • 你正确地复制了第二个字符串,
    • 您正确设置了空终止符,
    • 您将指针返回到分配的块。

    还有一些问题:

    • 你用malloc()返回的指针覆盖指向第一个字符串的指针,
    • 您从分配的内存块中读取而不是复制第一个字符串:这具有未定义的行为,
    • (次要)参数字符串应声明为const char *,因为您不修改这些字符串。

    这是一个更正的版本:

    #include <stdlib.h>
    #include <string.h>
    
    char *concat(const char *s, const char *t) {
        char *ret = malloc((strlen(s) + strlen(t) + 1) * sizeof(char));
        char *p = ret;
        while (*s != '\0') {
            *p++ = *s++;
        }
        while (*t != '\0') {
            *p++ = *t++;
        }
        *p = '\0';
        return ret;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多