C - 如何在没有 string.h 和动态内存分配的情况下连接字符串



我必须做一个练习,我给出了这个结构:

typedef struct {
    char *str;
    unsigned int len;
} String;

我的任务是编写一个字符串连接"Kartoffel""puffer""Kartoffelpuffer"(土豆油条)。

String concat(String l, String r)

运行函数后,不应更改字符串lr。首先,我创建了两个字符串:

String1 *l = malloc(sizeof(String1));
String1 *r = malloc(sizeof(String1));
(*l).str = malloc(sizeof("Kartoffel"));
(*r).str = malloc(sizeof("puffer"));
(*l).str = "Kartoffel";
(*r).str = "puffer";
(*l).len = 9;
(*r).len = 6;

然后我写了 concat 函数:

String1 concat(String1 l, String1 r) {
    unsigned int i = 0;
    String1 *newStr = malloc(sizeof(String1));
    /* +1 for '' at the end */
    newStr->str = malloc(l.len + r.len + 1);
    newStr->str = l.str;
    /* The following line is not working */
    newStr->str[l.len] = *r.str;
    newStr->len = l.len + r.len;
    return *newStr;
}

我试图做的是使用指针算法。当有一个指针指向像char *str这样的存储区域的开头时,应该可以用a[b]*((a) + (b))移动指针吧?当我运行代码时,我得到分段错误(我希望这是正确的翻译。原文:"Speicherzugriffsfehler")。如果有人能给我一个提示,我将不胜感激。PS:对不起我的英语。

首先,(*l).str = "Kartoffel"; (*l).str指向"Kartoffel"字符串文字,这意味着分配给(*l).str的原始内存与malloc()丢失。(*r).str = "puffer";也一样。为了避免这种情况,您可以做的一件事是通过循环 for 循环中的字符将字符串复制到分配的缓冲区中(因为您不能使用 string.h )。

然后,在你的concat()函数中,你做同样的事情。您使用 malloc()newStr->str分配内存(为 null 终止符正确分配额外的char),但在下一行中,您将该指针重新分配给指向 l.str ,该指针仍指向字符串文字。然后,使用 newStr->str[l.len] = *r.str; 尝试修改字符串文本,这在 C 中是未定义的行为。

解决此问题的方法可能是再次将两个字符串复制到分配的缓冲区中 newStr->str = malloc(l.len+r.len+1); .

将模因分配给newStrnewStr->str
之后可以使用两个指针。
char *to, *from;使用to = newStr->str;from = l.str;
设置指针复制带有*to = *from;
字符使用to++;from++;
推进指针重复直到*from == 0
使用from = r.str;
设置from to不需要重置,因为它在newStr->str末尾正确定位。
重复字符的副本。
重复前进指针。
使用 *to = 0; <</p>

div class="one_answers" 设置终止 0>

非常感谢您的帮助!正如你们所说,我写了另一种方法来复制字符串。

char * copyStr (char * dest,char * src){
    unsigned int index;
    for (index = 0; src[index] != ''; index++) {
            dest[index] = src[index];
    }
    dest[index] = '';
    return dest;
}

我像这样编辑了我的 concat:

String1 concat (String1 l, String1 r){
    String1 *newStr = malloc(sizeof(String1));
    newStr->str = malloc(l.len+r.len+1);
    copyStr(newStr->str,l.str);
    copyStr((newStr->str+l.len),r.str);
    newStr->len = l.len+r.len;
    return *newStr;
}

newStr->str+l.len指针将被移动。如果 l.len 为 9,指针将指向第 10 个字节,即第一个字符串 l 的末尾。因此,字符串 r 将被复制到第一个字符串 l 后面的内存存储中。

相关内容

  • 没有找到相关文章