在给定文本中查找子字符串.. C程序

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机器上运行它..它给我一个运行时错误“分段错误”。 这个错误到底是什么..为什么它会给出这个错误..

谢谢..

你需要为temp分配内存 – 目前它只是一个dangling pointer 。 您可以使用malloc ,但请注意,调用者需要确保此存储随后是free

例如:

 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; } 

temp未初始化。

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

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

如果您希望写入length + 1字符,则必须指向至少那么多字节的空间。

由于您希望返回字符串,因此您需要将其设置为static (但这可能很危险),或者动态分配空间:

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

我正在将子字符串的副本复制到另一个指针中,这是查找给定字符串的一个子字符串的简单方法。

希望我以正确的方式非常简单。

此外,SysAdmin给出的方法,看起来相当复杂,但仍然不是建议的..我会尝试学习那些..但是如果你能告诉我是否已经正确实现了非常基本的模式搜索算法,那会很好..

谢谢..

虽然答案很明显 – 即temp没有初始化,这里有一个建议。

如果你打算在另一个字符串中找到一个子字符串,那么很少有选择,

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

Update :最初我认为这个问题与查找子字符串(基于标题)有关。 无论如何,这看起来像strchr()实现。

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

您必须使用malloc或strdup并完成剩下的工作。 但是,您可能还想探索使用strncpy(null terminate)来简化代码。