【问题标题】:cannot get the length of a string through strlen in other function?在其他函数中无法通过strlen 获取字符串的长度?
【发布时间】:2021-07-12 13:33:05
【问题描述】:

我正在用 C 语言创建一个函数,用于删除字符串中的所有重复项。
如果我运行此代码并在main() 函数中提供index,它就可以工作。

char *clean(char *list, int index) {
    int val = 0;
    char temp_list[index];
    for (int i = 0; i < index; i++) {
        if (list[i] != list[i + 1]) {
            temp_list[val] = list[i];
            val += 1;
        }
    }
    for (int y = 0; y < val; y++) {
        list[y] = temp_list[y];
    }
    return list;
}

但如果我运行这段代码,它似乎不起作用。

char *clean(char *list) {
    int index = strlen(list);
    int val = 0;
    char temp_list[index];
    for (int i = 0; i < index; i++) {
        if (list[i] != list[i + 1]) {
            temp_list[val] = list[i];
            val += 1;
        }
    }
    for (int y = 0; y < val; y++) {
        list[y] = temp_list[y];
    }
    return list;
}

在第二个代码中,索引始终为零。
谁能解释一下为什么strlen() 函数不起作用。

【问题讨论】:

  • 一旦iindex-1list[i + 1] 会是什么?而且你不会用'\0' 终止你的temp_list。如果没有重复,甚至没有空间。为了完整起见,您应该为工作和非工作情况发布minimal reproducible example
  • strlen() 完美运行。请告诉我们minimal reproducible example,以便我们了解您如何调用您的函数。

标签: c string strlen


【解决方案1】:

问题不在你想的地方:你在减少字符串长度时没有设置空终止符,所以修改后的list仍然有尾随字节,并且可以访问。

这是一个没有临时数组的修改版本:

#include <stddef.h>

char *clean(char *s) {
    size_t i, j;
    for (i = j = 0; s[i] != '\0'; i++) {
        if (s[i] != s[i + 1]) {
            s[j++] = s[i];
        }
    }
    s[j] = '\0';
    return s;
}

【讨论】:

  • 这将解决我的问题,但它可能无法回答我的问题,即为什么 strlen() 不能在 clean() 函数中工作,因为当我在 main 中传递字符串时,它会给我所需的结果,但是如果我在 clean() 函数中传递相同的字符串,则 strlen() 函数在末尾有空字符时不起作用。
  • @Aditya76:两个函数的行为应该相同。您没有发布的代码中肯定还有另一个问题。你能发布一个完整的可编译示例吗?
猜你喜欢
  • 2013-12-09
  • 2015-03-16
  • 2016-01-01
  • 2019-03-11
  • 1970-01-01
  • 2022-09-29
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多