我想写一个函数清除数字和符号中的任何字符串!@#$%^& *()_ +但总是出现此错误: * glibc检测到 ./clear:无效的fastbin条目(免费):0x0000000001d29490 * *
以下是代码:
void clean(char *dirty)
{
int i = 0, j = 0;
char *temp;
temp = strdup(dirty);
while(i < strlen(temp))
{
if(isalpha(temp[i]) && isspace(temp[i]))
{
dirty[j] = temp[i];
j++;
}
i++;
}
dirty[j] = '\0';
free(temp);
}
答案 0 :(得分:2)
您应该检查strdup
的返回值。如果内存分配遇到问题(例如内存不足),则temp
获取值NULL
。检查是否是这种情况并退出并显示错误消息。
您的if语句始终为false:
if(isalpha(temp[i]) && isspace(temp[i]))
temp[i]
怎么可能是字母数字和空间?
另请注意(尽管不是问题)这对for
来说比while
更重要(循环遍历数组的所有元素直到结束)。使用预期的习语总是好的。
这也可以在适当的位置完成(不需要temp
字符串):
dirty[j] = dirty[i];
因为i
大于或等于j
。
答案 1 :(得分:2)
可能有几个原因导致OP的代码崩溃:
1 strdup()
返回NULL
。
测试其结果:
char * temp = strdup();
if (NULL == temp)
{
perror("strdup()" failed");
return;
}
2 在64位系统上:strdup()
原型缺失
包含相应的标题和,因为它是不是一个标准C,函数确保它在那里定义:
#define _POSIX_C_SOURCE 200809L /* or greater */ /* for gcc us option -std=c99 */
#include <string.h>
根据 lulyon 的评论:对于启用#define
原型设计的各种其他可能strdup()
,请read here。
3 传递给clean(char * dirty)
的字符串为NULL
执行输入验证:
if (NULL == dirty)
{
perror("invalid input");
return;
}
4 传递给clean(char * dirty)
的字符串引用不可变的常量
不调用干净
像这样:
char * dirty = "*ç%&/*alk 42";
clean(dirty);
都不喜欢这样:
clean("*ç%&/*alk 42");
也不喜欢这样:
#define dirty "*ç%&/*alk 42"
clean(dirty);
5 (根据Mike Hartl的评论)传递给clean(char * dirty)
的字符串缺少0
- 终止
无法从clean()
内部检测到,因此请修改输入。
答案 2 :(得分:1)
if(isalpha(temp[i]) && isspace(temp[i])) // logic AND. The character could not be both alpha and space
应该是
if(isalpha(temp[i]) || isspace(temp[i])) // logic OR.
代码的剩余部分没有问题。
更新
代码在我的Window PC上正常运行。所以我在这里只建议检查errno
以查找错误。
还有一件事,在使用之前检查指针char *dirty
和char *temp
是否为空。
更新
解释strdup
的有用链接:Strdup returning address out of bounds
答案 3 :(得分:0)
你的循环逻辑似乎有缺陷。这永远不会成立
isalpha(temp[i]) && isspace(temp[i])
所以j
最后总是0
。
答案 4 :(得分:0)
如果您在linux下工作,您可以考虑使用valgrind进行内存问题检测