首页 > 解决方案 > 在其他函数中无法通过strlen 获取字符串的长度?

问题描述

我正在 C 中创建一个函数,它从字符串中删除任何重复项。
如果我运行此代码并提供indexinmain()函数,它就可以工作。

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()功能不起作用。

标签: cstringstrlen

解决方案


问题不在您想的地方:您在减少字符串长度时没有设置空终止符,因此修改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;
}

推荐阅读