为什么我会在我的子串中找到奇怪的字符?

时间:2015-04-11 04:39:22

标签: c arrays char substring

我正在尝试在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;
} 

3 个答案:

答案 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 = 3e = 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