3

我想编写一个函数来清除数字和符号中的任何字符串,例如 !@#$%^&*()_+ 但我总是收到此错误:* glibc detected./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);
}
4

5 回答 5

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的评论:有关其他各种可能的原型制作#definestrdup()阅读此处


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(),因此修复输入。

于 2013-09-10T10:24:43.790 回答
2

您应该检查strdup. 如果内存分配遇到问题(例如内存不足),temp则获取值NULL。检查是否是这种情况并退出并显示错误消息。


您的 if 语句总是错误的:

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

怎么可能temp[i]同时是字母数字空格?


另请注意(尽管这不是问题),这是一项工作,而for不是while(循环遍历数组的所有元素直到结束)。使用预期的成语总是好的。

这也可以就地完成(不需要temp字符串):

dirty[j] = dirty[i];

因为i大于或等于j

于 2013-09-10T09:20:45.630 回答
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它们是否为空。

更新:

一个有用的链接解释strdupStrdup return address out of bounds

于 2013-09-10T09:19:44.397 回答
0

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

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

所以j将永远0在最后。

于 2013-09-10T09:20:00.373 回答
0

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

于 2013-09-10T10:07:35.490 回答