为什么我的子字符串前有奇怪的字符?

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 = 3e = 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=]';