c - 程序错误之间的字符串

标签 c string function char return

我的程序有点问题。它的工作方式是函数应该在我选择的两个字符之间返回一串字符,例如“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/

相关文章:

c - "Undefined reference to"不知道为什么?

python - 在字符串中查找数字,加 1 并替换

javascript - 如何使用 Javascript(不是 html)用 onclick 事件声明事件对象?

c - 使用 fclose 到 popen 的管道是一个严重的错误?

c - 是否可以在不使用数组的情况下读取文本文件? C

c - 如何测试我自己的(小型)嵌入式操作系统的可靠性?

java - 我可以使用正则表达式或其他方式更快地执行此操作吗?

c# - 将 16 位字符串拆分为 4 个部分并将它们存储在 C# 中的数组中

javascript - 在 jQuery 插件中接受文本字符串而不是元素

python - 识别连续的数据序列并计算其长度