我的程序有点问题。它的工作方式是函数应该在我选择的两个字符之间返回一串字符,例如“a1234a”,我想返回“a”之间的所有字符,我会得到 1234。问题是我的输出也打印了第一个'a',所以我得到了“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;
}
我试过在 if(counter == 1)
语句中添加 s[i] != c
,但后来情况变得更糟并且不打印任何东西。我对 C 还是很陌生,所以请尽可能简单地解释 :) 感谢阅读!
最佳答案
这个实现有两个问题。
首先,char* strBetween = malloc(strlen(s));
不会为空终止字符分配内存,假设您的目标是分配足够的空间来容纳长度为 string等于输入字符串。其次,如果你通过 for 循环进行推理,你会看到它实际上所做的是将字符 c
加上感兴趣的字符串(例如“a1234”)复制到你从索引开始分配的字符串中它在输入字符串中找到。
在“a1234a”作为输入字符串的情况下,它将复制“a1234_”(最后一个字符未定义)。但是,假设输入字符串是“ggga1234aggg”。输出将是字符串“___a1234____”,其中“_”字符未定义。在 if
条件中添加 s[i] != c
不起作用的原因是您仍然没有解决开头的未定义字符字符串。在这种情况下,您仍然以“_1234-”结尾(使用 - 而不是 _ 以避免斜体)。最有可能的是,未定义的字符将是 0
(即空终止符),在这种情况下,它本质上是一个长度为零的字符串,这解释了您的结果。但当然,无论如何您都不应该依赖未定义的行为。
关于c - 程序错误之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39485964/