C 为什么我的子字符串中有奇怪的字符?
我试图在C中创建一个函数,返回任何给定字符数组的子字符串。它为我提供了大部分正确的输出,但我在字符串的开头也得到了一些奇怪的字符。例如,当输入“abcdefg”并要求输入字符3到5时,它会给我“ÀvWdef”。因此,我似乎正确地切断了g,但它只是对前3个字符做了一些奇怪的事情,而不是忽略它们。我的代码包括在下面: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
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
,即严格不等式