2010-05-05 48 views
3
char *substring(char *text, int position, int length) 
{ 
    int i, j=0; 
    char *temp ; 

    for(i=position-1; i<position+length-1; i++) 
    { 
    temp[j++] = text[i]; 
    } 
    temp[j] = '\0'; 

    return temp; 
} 

嗨以下代码中的错误是什么..我试图在Fedora机器上运行此..它给我一个运行时错误“分段故障”。这是什么错误一回事..,为什么它给这个错误..要查找给定文本中的子字符串.. C程序

谢谢..

+2

当您访问不应该存在的内存时,通常会出现“分段错误”。哎呀。程序中一个非常明显的缺陷就是'* temp'永远不会被初始化为任何东西。 [见Binky指针有趣的视频!](http://cslibrary.stanford.edu/104/) – 2010-05-05 05:56:57

回答

3

您需要为temp分配内存 - 目前它的只是一个dangling pointer。您可以使用malloc,但请注意,主叫方需要确保此存储随后为free d。

例如:

char *substring(const char *text, int position, int length) 
{ 
    char *temp = malloc(length + 1); 
    int i, j; 

    for (i = position, j = 0; i < position + length; i++, j++) 
    { 
     temp[j] = text[i]; 
    } 
    temp[j] = '\0'; 

    return temp; 
} 
+0

我怎样才能释放内存在这里,因为同一指针正在返回到其他功能... – AGeek 2010-05-05 06:11:40

+0

但这里一必须小心以释放我们为temp分配的内存。来电者应该承担额外的责任。 – dicaprio 2010-05-05 06:39:45

+0

@RBA:理想情况下,调用者应该负责释放内存。换句话说,你也可以传递另一个参数给这个函数,说char * pcSubStr“,它将IN-OUT并返回子串。这样你就可以在你需要的函数中释放这个函数。 – dicaprio 2010-05-05 06:59:27

6

temp未初始化。

2

这意味着您的代码违反了操作系统设置的一些限制,在这种情况下,您正在写入内存,您无权写入。

这是因为您的temp变量只是一个未初始化的指针,它不包含您允许写入的内存地址。

如果您希望编写length + 1字符,它必须指向至少多个字节的空间值。

既然你希望返回的字符串,你需要或者使其static(但可能是危险的),或者动态分配空间:

if((temp = malloc(length + 1)) == NULL) 
    return NULL; 
0

而答案是显而易见的 - 即临时未初始化, 这里是一个suggetion。

如果你的目的是要找到一个子在另一个字符串, 几个备选方案,

1. use C strstr(...) 
2. Robin-Karp method 
3. Knuth-Morris-Pratt method 
4. Boyer Moore method 

Update: Initialy我想这个问题涉及到寻找字符串(基于标题)。无论如何,这看起来像strchr()的实现。

+0

我正在将子字符串拷贝到另一个指针中,这只是寻找给定字符串的一个子字符串的简单方法.. 希望我是那样简单的方式以正确的方式.. 此外,由SysAdmin给出的方法,看起来相当复杂的,但还是比建议..我会尝试D学习这些以及..但如果你可以告诉我,我是否已经正确实施了非常基本的模式搜索算法,那么它会非常亲切...... 谢谢.. – AGeek 2010-05-05 06:13:02

+1

我认为OP的意图不是“find”as在* search *中,而是在* get *或* return *中查找。 “find”这个词的用法在英语中并不常见,在编程环境中通常不会使用。 – 2010-05-05 06:20:07

0

我提出的子字符串的拷贝到另一个指针,这是刚刚找到一个给定的字符串的一个子的简单方式..

希望我在正确的方式很简单的方法..

另外,由SysAdmin给出的方法,看起来相当复杂的,但还是比建议..我会尝试和学习这些以及..但如果你可以告诉我,我是否已经实施基本模式搜索算法正确,那么它会很亲切..

谢谢..

0

从代码中可以明显看出,您错过了分配/初始化指针* temp的操作。它指向无处。

您必须使用malloc或strdup,然后执行其他操作。但是,你可能还想探索使用strncpy(null terminate)来简化代码。

相关问题