程序在运行时挂起,编译好

时间:2011-03-24 21:15:43

标签: c++ const-char

已编辑:

     #include<iostream>
using namespace std;
#include<conio.h>
#include<string.h>

void dfsvisit(int a[][30], int i, const char *color[])
     {
        int v;
        int p[30];
        int f[30]={};
        static int j=1;
        color[i]="gray";

        for(v=1;v<31;v++)
            while(a[i][v]!=0)
                if(!strcmp(color[a[i][v]],"white"))
                    {
                        p[a[i][v]]=i;
                        dfsvisit(a,i,color);
                    }

        color[i]="black";
        j++;
        f[i]=1;
        cout<<f[i]<<" ";
     }

int main()
{
    int a[][30]={{2, 16},{4, 8},{5, 16, 21},{1, 2},{1, 9, 27},{1, 10, 15},{4, 6, 11, 12},{4, 16},{2, 19, 29},{3, 14, 28},{3, 13, 15, 17},{8, 9, 18, 26},{1, 7, 10, 19},{5, 8, 20, 24},{3, 21, 29},{1, 2, 8},{16, 23, 28, 29},{4, 12, 21, 24},   {3, 15, 16},{2, 3, 6, 22},{4, 15, 25},{4, 6, 20, 24},{9, 10, 11, 12},{19, 26, 30},{2, 27, 29},{1, 28, 29, 30},{8, 16, 29},{6, 10, 30},{19, 21, 27},{1, 2, 3, 22}};
    int i;
    const char *color[30];

    for(i=1;i<31;i++)
        color[i]="white";

    for(i=1;i<31;i++)
        if(!strcmp(color[i],"white"))
            dfsvisit(a,i,color);

    return 0;

}

只是想确定我使用const char c是否正确?如果是的话,我还在哪里做错了?我试图在codeblocks上运行它。它编译得很好,但是当我尝试运行它时,它显示程序已经停止工作。

感谢。

6 个答案:

答案 0 :(得分:3)

变化:

for(i=1;i<=30;u++)

为:

for (i = 0; i < 30; i++)

答案 1 :(得分:2)

您正在将指针与常量字符串进行比较,当字符串相等时,这些字符串可能相等也可能不相等。对这种算​​法使用enum

enum { BLACK, GRAY, WHITE };

答案 2 :(得分:2)

你这样说:

for(i=1;i<=30;u++)

编译?

我建议将u更改为i ...

修改 好的,所以你说u是一个错字。 下一步:在调试器中启动它,等待它循环,进入并逐步完成。 这应该告诉你循环变量发生了什么。

编辑2:
&LT; niggle&gt;
我是第二个建议你使用std :: string的人。您可以考虑删除不规则数组,而不是std::vector s std::vector s,通过使用迭代器,它会为您捕获循环中的fencepost error。一般来说,STL vector比阵列更安全,更舒适,同时又快又小 尽管如此,最好的做法是在for内而不是在函数范围的开头(RAII)声明循环变量。当然,除非在循环后需要值 &LT; / niggle&gt;

编辑3:
有关std :: string,std :: vector和std :: otherStuff的更多信息:本书Accelerated C++对C ++,特别是STL进行了很好的介绍。在STL-做事方式得到安全覆盖和实践之后,像char*或数组这样的概念才出现得很晚。我真的很想看到Boost图书馆那样的东西......

答案 3 :(得分:2)

首先,你的for循环不正确,它应该是这样的:

for(i = 0; i < 30; i++)

其次,您的数组int a[][30]应该类似于int a[30][](包含2,3或4个整数的30个元素)。

第三,你不能传递这样的数组,使用指针。

嗯,这段代码不清楚,递归函数可能会导致堆栈溢出。

我希望它会对你有所帮助。

答案 4 :(得分:1)

您希望使用strcmp而不是==进行字符串比较。

然而,目前尚不清楚为什么会这样。你已经删除了可能导致无限循环的代码。

答案 5 :(得分:1)

不,您没有正确使用C样式字符串(char *)。放弃并使用std::string代替。

例如:

const char *color[30];

for(i=1;i<31;i++)
    color[i]="white";

上面的片段会复制指针,并且不会复制文本。这可能是也可能不是你想要的。

更安全地重写:

const char * color[30]; // 30 pointers to char.
const char text_white[] = "white";

for (i = 0; i < 30; ++i)  // Note addition of spaces
{
   color[i] = text_white;
}

const char text_white[]向常量数据声明一个指针text_white。这将让编译器知道您何时尝试分配文字。

这个的C ++代码:

typedef std::vector<std::string> Text_Container;
Text_Container texts;
const std::string white_text("white");
const unsigned int MAX_TEXTS = 30;
for (i = 0; i < MAX_TEXTS; ++i)
{
    texts[i] = white_text;  // Makes a copy of the string.
}

放弃char *文字,除非您的程序需要以节省内存。首选std::stringstd::vector