c - 在其他函数中无法通过strlen 获取字符串的长度?
问题描述
我正在 C 中创建一个函数,它从字符串中删除任何重复项。
如果我运行此代码并提供index
inmain()
函数,它就可以工作。
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()
功能不起作用。
解决方案
问题不在您想的地方:您在减少字符串长度时没有设置空终止符,因此修改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;
}
推荐阅读
- typescript - Knexfile.ts 不能使用 es 模块类型的导出
- sql - Rails 6中的数据库独立分组计数不同的“几天前”
- javascript - VueJS-我需要帮助实现重新渲染组件
- javascript - 通过 SSL 将 botpress 连接到外部 postgres 数据库服务器
- reactjs - spring-boot:Object 作为 API 请求变得空
- java - 3 个数字中的最大值
- r - 将表从 SQL Server 导入 R
- java - 我在 jsp 文件中使用了 write bean 标签,但是当我尝试使用响应对象创建输出流时,它给出了 IllegalStateException?
- python - 如何在文本示例中查找特定的二元组 - python?
- java - JDK中的`com.sun.org.slf4j.internal.Logger`和错误用法