我的程序有点问题。它的工作方式是一个函数应该在我选择的两个char之间返回一串char,例如" a1234a"我想要返回' a'之间的所有字符,我得到1234.问题是我的输出还打印了第一个' a'所以我得到&# 34; A1234"代替。代码如下:
char* string_between(char *s, char c){
int length = strlen(s);
int counter = 0;
char* strBetween = malloc(strlen(s));
for(int i = 0; i<length; i++){
if(s[i] == c){
counter++;
}
if(counter == 1){
strBetween[i] = s[i];
}
}
if(counter<2){
free(strBetween);
return NULL;
}
return strBetween;
}
我已尝试在s[i] != c
声明中添加if(counter == 1)
,但后来情况变得更糟,根本无法打印任何内容。我还是C的新手所以请尽可能简单地解释:)感谢阅读!
答案 0 :(得分:4)
此实施存在两个问题。
首先,char* strBetween = malloc(strlen(s));
不为空终止字符分配内存,假设您的目标是分配足够的空间来容纳长度等于输入字符串长度的字符串。其次,如果你通过for循环推理,你会看到它实际上做的是将字符c
加上感兴趣的字符串(例如&#34; a1234&#34;)复制到你分配的字符串中从索引开始,它在输入字符串中找到。
在&#34; a1234a&#34;作为输入字符串,它将复制&#34; a1234 _&#34; (最终字符未定义)。但是,假设输入字符串是&#34; ggga1234aggg&#34;。输出将是字符串&#34; ___ a1234 ____&#34;用&#34; _&#34;字符未定义。在s[i] != c
条件中添加if
并不起作用的原因是您仍然没有在字符串开头处寻址未定义的字符。在这种情况下,你仍然最终得到&#34; _1234 - &#34; (使用 - 而不是_来避免斜体)。最有可能的是,未定义的字符将是0
(即空终止符),在这种情况下,它本质上是一个长度为零的字符串,这解释了您的结果。但是,当然,无论如何,你都不应该依赖未定义的行为。
答案 1 :(得分:1)
如果你伪装成计算机并执行你的循环体,假设你处于目标角色,它应该是非常明显的。检查c
,增加计数器,然后检查计数器在同一次迭代中是否为1。显然,你要复制c
的第一个实例。
交换比较的顺序,或使用else if
作为第二个。
还添加代码以正确终止返回的字符串。