我必须做一个练习,我给出了这个结构:
typedef struct {
char *str;
unsigned int len;
} String;
我的任务是编写一个 String Concat,它将 "Kartoffel"
和 "puffer"
连接到 "Kartoffelpuffer"
(potato fritter)。
String concat(String l, String r)
字符串 l
和 r
在运行该函数后不应更改。
首先,我在主目录中创建了两个字符串:
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/