【问题标题】:String between program faults程序错误之间的字符串
【发布时间】:2023-03-13 07:36:01
【问题描述】:

我的程序有点问题。它的工作方式是一个函数应该在我选择的两个字符之间返回一个字符字符串,例如“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 还是很陌生,所以请尽可能简单地解释一下:) 感谢阅读!

【问题讨论】:

  • 请学习如何使用调试器。使用调试器,您可以逐行检查代码并查看它的作用,同时能够监视变量及其值。这是所有程序员都需要的一项基本技能。
  • 一个基本错误:未能终止返回的字符串。此外,您不能定义名称以str 开头的函数,这是一个保留的命名空间。
  • 想想istrBetween[i] = s[i]; 行中的价值。另外,如果c 不是不是输入字符串中的第一个字符会怎样?

标签: c string function char return


【解决方案1】:

这个实现有两个问题。

首先,char* strBetween = malloc(strlen(s)); 不会为空终止字符分配内存,假设您的目标是分配足够的空间来保存长度等于输入字符串的字符串。其次,如果您通过 for 循环进行推理,您会看到它实际上所做的是将字符 c 加上感兴趣的字符串(例如“a1234”)复制到您分配的字符串中,从它在输入字符串。

在“a1234a”作为输入字符串的情况下,它将复制“a1234_”(最后一个字符未定义)。但是,假设输入字符串是“ggga1234aggg”。输出将是字符串“___a1234____”,其中“_”字符未定义。在if 条件中添加s[i] != c 不起作用的原因是您仍然没有解决字符串开头的未定义字符。在这种情况下,您仍然会得到“_1234-”(使用 - 而不是 _ 以避免斜体)。最有可能的是,未定义的字符将是0(即空终止符),在这种情况下,它本质上是一个长度为零的字符串,这解释了您的结果。但当然,无论如何,您都不应该依赖未定义的行为。

【讨论】:

    【解决方案2】:

    如果您假装是计算机并执行循环的主体,假设您在目标角色处,那么它发生的原因应该很明显。您检查c,增加计数器,然后在同一迭代中检查计数器是否为1。显然你要复制c 的第一个实例。

    交换比较的顺序,或使用else if 进行第二个比较。

    还添加代码以正确终止返回的字符串。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      相关资源
      最近更新 更多