2011-02-13 52 views
1

对于许多问题,我已经在spoj和其他网站上解决了许多问题,我得到了分段错误(SIGSEGV)。我给予problm声明链接和代码。任何人都可以告诉我下面iv做的错误。 问题: http://goo.gl/CVROl我的代码中的分段错误(SIGSEGV)

在此先感谢。

#include<iostream> 
#include<cstdio> 
#include<cstring> 
#include<cmath> 

using namespace std; 

int main() 
{ 
    char a; 
    string final,dummy; 
    int t,h,p,k,z; 
    scanf("%d",&t); 
    while(t) 
    { 
     cin>>a>>h>>p; 
     final=a; 
     for(int i=0;i<h;i++) 
     { 
       k=0; 
       for(int j=0;final[j]!='\0';j++) 
       { 
        if(final[j]=='a') 
        { 
         dummy[k]='a'; 
         dummy[k+1]='b'; 
         k+=2; 
        } 
        else 
        { 
         dummy[k]='b'; 
         dummy[k+1]='a'; 
         k+=2; 
        } 
       } 
       final=dummy; 
      } 
      printf("%c\n",final[p-1]); 
      t--; 
     } 
     return 0; 
    } 
+0

我看不出有分配给“虚拟”内存。 – sstn

+0

需要咖啡,sry :( – gr0v3r

回答

0

finalstd::string型,这是不空终止的。

在您的for循环中:for(int j=0;final[j]!='\0';j++)您正在检查字符串的结尾,就像在C中那样(它是一个char* - null终止的字符串),但在C++中,您应该以其他方式遍历字符串字符:使用迭代器,计算字符串大小或其他内容。

快速快速解决这个问题(不知道是否还有其他人)是获得空终止char*表示finalfinal.c_str()和iterater了出来,你在干什么。

+0

或者,'for(int j = 0; j gr0v3r

2

正如sstn指出的那样,您没有为虚设分配内存。因为它是一个字符串,它看起来像你只是想追加字符,你可以这样做:

for(int j=0;j < final.size();j++) 
{ 
    if(final[j]=='a') 
    { 
     dummy.push_back('a'); 
     dummy.push_back('b'); 
    } 
    else 
    { 
     dummy.push_back('b'); 
     dummy.push_back('a'); 

    } 
} 
final=dummy;