【发布时间】:2011-10-26 17:26:30
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char* c1,char* c2)
{
char temp=*c1;
*c1=*c2;
*c2=temp;
}
void permutate( char str[], int index)
{
int i = 0;
static lastChar = 0;
if( index == strlen(str) )
{ // We have a permutation so print it
printf("%s\n",str);
return;
}
for( i = index; i < strlen(str); i++ )
{
if( lastChar == str[i] ) {
continue;
}
else {
lastChar = str[i];
}
swap( str+index, str+i ); // It doesn't matter how you swap.
permutate( str, index + 1 );
swap( str+index, str+i );
}
}
int main(int argc,char** argv)
{
permutate("abcdefgh",0);
return 0;
}
`
运行此程序时出现分段错误。当我自己运行交换功能时,它工作正常。
【问题讨论】:
-
这个代码真的太可怕了。从头再写一遍!永远不要为此目的使用静态变量,将其作为指针参数传递。永远不要在循环中调用 strlen ,它每次都会计算长度,并且这个操作会为每个字符重复,这使得计算复杂性很可怕。算法本身是错误的,并且用于计算某些东西的函数中的 printf 很糟糕,您必须始终将输出的表示与逻辑分开!如果我是你的老师,我会禁止你进入课堂 :) 我没有投反对票,因为我知道学习可能很困难。
-
好的。其实我没有写这段代码,只是从一个网站上拿来学习如何为一个字符串生成所有排列。我同意你所说的,在 for 循环中使用 strlen() 是可怕的。甚至我也不明白为什么要这样使用静态变量。就像我说的,我自己对这个程序不是很了解,所以我没有做太多修改。
-
不理解的复制粘贴更惨。计算它的算法非常简单。但是,下次您发布新问题时,您还应该发布有关代码应该做什么的所有细节,而不仅仅是代码本身。如果你正在学习 C,我建议你尝试自己解决这个问题,你会学到更多,当然你可以做得更好!
-
分段错误意味着您正在尝试读取或写入不属于您的进程的内存部分,这意味着您的代码存在错误,导致您的程序访问无效的内存区域。事实上,正如我所说,代码包含很多错误和坏事。
-
将 strlen() 放入循环中是一种典型的做法。任何足够聪明的编译器都会将长度计算代码放在循环之前(几乎总是作为内联函数)
标签: c segmentation-fault