为什么我的子字符串前有奇怪的字符?
Why am I getting strange characters leading my substring?
我试图在 C 中创建一个函数,returns 任何给定 char 数组的子字符串。它给了我大部分正确的输出,但我也在字符串的开头得到了一些奇怪的字符。例如,当给定输入 "abcdefg" 并询问字符 3 到 5 时,它给了我“ÀvWdef”。所以看起来我正确地切断了 g,但它只是对前 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] = '[=10=]';
return r;
}
你有一个逻辑错误:
while(s <= e){
r[s] = src[s];
s++;
}
src
的索引是正确的。但是 r
的索引不是。你需要另一个索引。
i = 0;
while(s <= e){
r[i] = src[s];
s++;
i++
}
循环后,代替:
r[s] = '[=12=]';
使用:
r[i] = '[=13=]';
您使用malloc
分配的字符数也存在逻辑错误。
给定 s = 3
和 e = 5
,您将返回一个由 src[3]
、src[4]
、src[5]
组成的字符串。那是3个字符。添加终止空字符时,需要 4 个字符。 (e - s + 1)
只给你 3
。请改用 (e - s + 2)
。
我认为问题可能出在这里:
r[s] = src[s];
改为
r[i++] = src[s];
其中 i
跟踪字符串 r
的索引,并初始化为 0
.
当您使用 malloc 分配内存块时,它可以填充任何内容,因此您应该首先将其写入零。
bzero(r,e-s+1);
此外,您想从索引 0 而不是索引 s 开始复制到 r。你不应该对两者都使用 s。
编辑 将 < 更正为 <=
for(i =0; i <= e-s;i++)
r[i] = src[s + i];
r[i] = '[=11=]';
我试图在 C 中创建一个函数,returns 任何给定 char 数组的子字符串。它给了我大部分正确的输出,但我也在字符串的开头得到了一些奇怪的字符。例如,当给定输入 "abcdefg" 并询问字符 3 到 5 时,它给了我“ÀvWdef”。所以看起来我正确地切断了 g,但它只是对前 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] = '[=10=]';
return r;
}
你有一个逻辑错误:
while(s <= e){
r[s] = src[s];
s++;
}
src
的索引是正确的。但是 r
的索引不是。你需要另一个索引。
i = 0;
while(s <= e){
r[i] = src[s];
s++;
i++
}
循环后,代替:
r[s] = '[=12=]';
使用:
r[i] = '[=13=]';
您使用malloc
分配的字符数也存在逻辑错误。
给定 s = 3
和 e = 5
,您将返回一个由 src[3]
、src[4]
、src[5]
组成的字符串。那是3个字符。添加终止空字符时,需要 4 个字符。 (e - s + 1)
只给你 3
。请改用 (e - s + 2)
。
我认为问题可能出在这里:
r[s] = src[s];
改为
r[i++] = src[s];
其中 i
跟踪字符串 r
的索引,并初始化为 0
.
当您使用 malloc 分配内存块时,它可以填充任何内容,因此您应该首先将其写入零。
bzero(r,e-s+1);
此外,您想从索引 0 而不是索引 s 开始复制到 r。你不应该对两者都使用 s。
编辑 将 < 更正为 <=
for(i =0; i <= e-s;i++)
r[i] = src[s + i];
r[i] = '[=11=]';