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

标签 c string pointers malloc concatenation

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

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

我的任务是编写一个 String Concat,它将 "Kartoffel""puffer" 连接到 "Kartoffelpuffer"(potato fritter)。

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 '\0' 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" string literal,意思是原来用malloc()分配给(*l).str的内存丢失了。与 (*r).str = "puffer"; 相同。为了避免这种情况,您可以做的事情之一是通过在 for 循环中遍历字符将字符串复制到分配的缓冲区中(因为您不能使用 string.h)。

然后,在您的 concat() 函数中,您执行相同的操作。您使用 malloc()newStr->str 分配内存(正确地为空终止符分配一个额外的 char),但是在下一行,您将该指针重新分配为指向 l.str,它仍然指向字符串文字。然后,使用 newStr->str[l.len] = *r.str; 您试图修改字符串文字,这在 C 中是未定义的行为。

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

关于C - 如何在没有 string.h 和动态内存分配的情况下连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170946/

相关文章:

c++ - 可靠地确定 char 的大小

java - 重复字符串序列,直到它在java中达到一定长度

C++ char * const vs char *,为什么有时一个有时另一个

python - 在 Python 和 C 之间实现回调

与具有成员 char *ptr 的类型混淆;使用的大小_t; size_t 尺寸?

C++ 具有相同 40 位散列值的两个不同字符串

arrays - 不计算空格计算字符串长度

c++ - 使用指针调用函数时出错

使用 C 中的 open()、read() 检查(逐字节)两个文件是否相等

ruby - 如何在 Ruby 中拆分字符串并获取除第一个之外的所有项目?