我的清洁功能有什么问题?

时间:2013-09-10 09:17:28

标签: c

我想写一个函数清除数字和符号中的任何字符串!@#$%^& *()_ +但总是出现此错误: * 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);
}

5 个答案:

答案 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 *dirtychar *temp是否为空。

更新

解释strdup的有用链接:Strdup returning address out of bounds

答案 3 :(得分:0)

你的循环逻辑似乎有缺陷。这永远不会成立

isalpha(temp[i]) && isspace(temp[i])

所以j最后总是0

答案 4 :(得分:0)

如果您在linux下工作,您可以考虑使用valgrind进行内存问题检测