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

C 为什么我的子字符串中有奇怪的字符?,c,arrays,char,substring,C,Arrays,Char,Substring,我试图在C中创建一个函数,返回任何给定字符数组的子字符串。它为我提供了大部分正确的输出,但我在字符串的开头也得到了一些奇怪的字符。例如,当输入“abcdefg”并要求输入字符3到5时,它会给我“ÀvWdef”。因此,我似乎正确地切断了g,但它只是对前3个字符做了一些奇怪的事情,而不是忽略它们。我的代码包括在下面: typedef char * String; String subStr(String src, int start, int end){ if ((start > (s

我试图在C中创建一个函数,返回任何给定字符数组的子字符串。它为我提供了大部分正确的输出,但我在字符串的开头也得到了一些奇怪的字符。例如,当输入“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] = '\0';

   return r;
} 
typedef char*字符串;
字符串subStr(字符串src、int start、int end){
如果((开始>(strLen(src)-1))| |开始<0 | |结束<开始||
(完)(strLen(src)1){
返回NULL;
}
int s=开始,e=结束;
字符串r=(字符串)malloc((e-s+1)*sizeof(char));

而(s您在以下方面存在逻辑错误:

while(s <= e){
   r[s] = src[s];
   s++;
}
在循环之后,而不是:

r[s] = '\0';
使用:

使用
malloc
分配的字符数也存在逻辑错误


给定
s=3
e=5
,您将返回一个由
src[3]
src[4]
src[5]
组成的字符串。即3个字符。添加终止空字符时,需要4个字符。
(e-s+1)
只提供
3
。使用
(e-s+2)
取而代之。

您在以下方面有一个逻辑错误:

while(s <= e){
   r[s] = src[s];
   s++;
}
在循环之后,而不是:

r[s] = '\0';
使用:

使用
malloc
分配的字符数也存在逻辑错误


给定
s=3
e=5
,您将返回一个由
src[3]
src[4]
src[5]
组成的字符串。即3个字符。添加终止空字符时,需要4个字符。
(e-s+1)
只提供
3
。使用
(e-s+2)
取而代之。

您在以下方面有一个逻辑错误:

while(s <= e){
   r[s] = src[s];
   s++;
}
在循环之后,而不是:

r[s] = '\0';
使用:

使用
malloc
分配的字符数也存在逻辑错误


给定
s=3
e=5
,您将返回一个由
src[3]
src[4]
src[5]
组成的字符串。即3个字符。添加终止空字符时,需要4个字符。
(e-s+1)
只提供
3
。使用
(e-s+2)
取而代之。

您在以下方面有一个逻辑错误:

while(s <= e){
   r[s] = src[s];
   s++;
}
在循环之后,而不是:

r[s] = '\0';
使用:

使用
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

我认为问题可能在这里:

r[s] = src[s];
换成

r[i++] = src[s];

其中
i
跟踪字符串
r
的索引,并初始化为
0

我认为问题可能在这里:

r[s] = src[s];
换成

r[i++] = src[s];

其中
i
跟踪字符串
r
的索引,并初始化为
0

我认为问题可能在这里:

r[s] = src[s];
换成

r[i++] = src[s];

其中,
i
跟踪字符串的索引
r
,并将其初始化为
0

,当您使用malloc分配内存块时,它可以填充任何内容,因此您应该首先将其写入零

bzero(r,e-s+1);
此外,您希望开始从索引0而不是索引s复制到r。不应同时使用s


Editcorrected
bzero(r,e-s+1);
此外,您希望开始从索引0而不是索引s复制到r。不应同时使用s


Editcorrected
bzero(r,e-s+1);
此外,您希望开始从索引0而不是索引s复制到r。不应同时使用s


Editcorrected
bzero(r,e-s+1);
此外,您希望开始从索引0而不是索引s复制到r。不应同时使用s


Editcorrected<除了“R Sahu”指出的错误之外,如果您打算将
start
end
设置为一个/包含/范围,那么您的malloc将分配一个字符/少于/所需的字符。或者,如果您打算将其设置为半开放范围(这是“标准”方式),则while循环条件应变为
while(s
即严格的不平等性。除了“R Sahu”指出的错误外,如果您打算将
开始
结束
设置为一个/包含/范围,那么您的malloc分配的字符数比所需字符数少/个。或者,如果您打算将其设置为半开放范围(这是“标准”方式),则while循环条件应变为
while(s
即严格的不平等性。除了“R Sahu”指出的错误外,如果您打算将
开始
结束
设置为一个/包含/范围,那么您的malloc分配的字符数比所需字符数少/个。或者,如果您打算将其设置为半开放范围(这是“标准”方式),则while循环条件应为
while(s
,即严格不等式