我必须做一个练习,我给出了这个结构:
typedef struct {
char *str;
unsigned int len;
} String;
我的任务是编写一个字符串连接"Kartoffel"
并"puffer"
到"Kartoffelpuffer"
(土豆油条)。
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 ' ' 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);
.
将模因分配给newStr
和newStr->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>
非常感谢您的帮助!正如你们所说,我写了另一种方法来复制字符串。
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 后面的内存存储中。