我正在尝试在C中创建一个函数,它返回任何给定char数组的子字符串。它给了我大部分正确的输出,但我在字符串的开头也得到了一些奇怪的字符。例如,当给出输入“abcdefg”并询问字符3到5时,它给出了“ÀvWdef”。因此看起来我正好得到了切断,但它只是对前3个字符做了一些奇怪而不是忽略它们。我的代码包含在下面:
typedef char * String;
String subStr(String src, int start, int end){
if ((start > (strLen(src)-1)) || start < 0 || end < start ||
(end > (strLen(src) - 1)) ){
return NULL;
}
int s = start, e = end;
String r = (String)malloc((e - s + 1) * sizeof(char));
while(s <= e){
r[s] = src[s];
s++;
}
r[s] = '\0';
return r;
}
答案 0 :(得分:2)
您在:
中遇到逻辑错误while(s <= e){
r[s] = src[s];
s++;
}
src
的索引是正确的。但r
的索引不是。你需要另一个索引。
i = 0;
while(s <= e){
r[i] = src[s];
s++;
i++
}
循环后,而不是:
r[s] = '\0';
使用:
r[i] = '\0';
使用malloc
分配的字符数也存在逻辑错误。
鉴于s = 3
和e = 5
,您返回的字符串包含src[3]
,src[4]
,src[5]
。那是3个字符。添加终止空字符时,需要4个字符。 (e - s + 1)
仅为您提供3
。请改用(e - s + 2)
。
答案 1 :(得分:1)
当你用malloc分配一块内存时,它可以被任何东西填充,所以你最初应该把它写为零。
bzero(r,e-s+1);
此外,您希望从索引0而不是索引s开始复制到r。你不应该同时使用s。
修改已更正&lt;到&lt; =
for(i =0; i <= e-s;i++)
r[i] = src[s + i];
r[i] = '\0';
答案 2 :(得分:0)
我认为问题可能在这里:
r[s] = src[s];
将其更改为
r[i++] = src[s];
其中i
跟踪字符串r
的索引,并初始化为0
。