在给定文本中查找子字符串.. 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)来简化代码。