Click here to Skip to main content
15,920,111 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
im learning string permutation, what is wrong with my code? it produce segmentation fault?

C++
#include <bits/stdc++.h> 
using namespace std; 
  
  
// Function to print permutations of string  
// This function takes three parameters:  
// 1. String  
// 2. Starting index of the string  
// 3. Ending index of the string.  
vector<vector<int>> permute(vector<int>nums,vector<vector<int>>k,vector<int>li)  
{  
if(nums.empty()){
k.push_back(li);
}else{
  for(int i=0;i<nums.size();i++){
   int chos=nums[i];
   li.push_back(chos);
   nums.erase(nums.begin()+i);
   permute(nums,k,li);
   nums.insert(nums.begin()+i,chos);
   li.erase(li.end());
  }
}
}  
  
// Driver Code  
int main()  
{  
   vector<int>permut={1,2,3};
    vector<vector<int>>k; 
    vector<int>li;
       
   permute(permut,k,li);  
    return 0;  
}  


What I have tried:

i tried to debug it but produce segmentation fault error. why is that?
Posted
Updated 28-Oct-19 0:34am
v2
Comments
Stefan_Lang 28-Oct-19 3:24am    
How can you get a segmentation fault when the code doesn't even compile? Your' function permute() is declared to return a value, but the implementation does not.

While it's a trivial error and easy to fix, this raises the question whether the code you ran does not contain more stuff that you omitted here! Please make sure that you do post the exact code you ran, not some intermediate state!

Since you did not mention which line causes the segmentation fault, I assume is this line.
li.erase(li.end());
You must pass a valid iterator to erase(). end() is the iterator, one after the last element, which is not valid.
 
Share this answer
 
Comments
Stefan_Lang 28-Oct-19 6:37am    
Yes, once you fix the code (missing return statement) it crashes there. Just posted a solution before realizing you already spotted the problem before me.

5 points!
Quote:
im learning string permutation, what is wrong with my code?

First, you code is playing with integers, not strings.
Quote:
it produce segmentation fault?

No matter what you did exactly, your code is trying to read/write a memory place it don't own, this means that it try to read/write after the end of an array/vector.
Quote:
i tried to debug it but produce segmentation fault error.

Debugger does not correct anything, it only show you what is doing your code, The debugger shows you the position of error and values of variables.
If you look carefully, you will see what operation is wrong.

By the way, telling us the position or error would help us to spot what is the problem, because the array in this line of code is the guilty one.
-----
Advice: Learn to indent properly your code, it show its structure and it helps reading and understanding. It also helps spotting structures mistakes.
C++
#include <bits/stdc++.h>
using namespace std;


// Function to print permutations of string
// This function takes three parameters:
// 1. String
// 2. Starting index of the string
// 3. Ending index of the string.
vector<vector<int>> permute(vector<int>nums,vector<vector<int>>k,vector<int>li)
{
    if(nums.empty()){
        k.push_back(li);
    }else{
        for(int i=0;i<nums.size();i++){
            int chos=nums[i];
            li.push_back(chos);
            nums.erase(nums.begin()+i);
            permute(nums,k,li);
            nums.insert(nums.begin()+i,chos);
            li.erase(li.end());
        }
    }
}

// Driver Code
int main()
{
    vector<int>permut={1,2,3};
    vector<vector<int>>k;
    vector<int>li;

    permute(permut,k,li);
    return 0;
}

Indentation style - Wikipedia[^]

Professional programmer's editors have this feature and others ones such as parenthesis matching and syntax highlighting.
Notepad++ Home[^]
ultraedit[^]
 
Share this answer
 
Comments
Stefan_Lang 28-Oct-19 6:40am    
Good advice all! Maybe you should add that inserting a few spaces now and then greatly enhances readability too! Programming is not a contest for minimal code length!
Patrice T 28-Oct-19 7:08am    
Agreed, but not too much things at same time. :)
C++
li.erase(li.end());
will always crash! Reason: std::vector<int>::erase() with one argument takes an iterator and tries to eliminate an element at the position referenced by this iterator. Since end() by definition is the iterator that points nowhere, you're accessing 'nowhere' --> seg fault!

Maybe you intended to clear the list? This could be achieved using the two argument variant of erase:
C++
li.erase(li.begin(); li.end());

But, much simpler, you could just use clear():
C++
li.clear();


P.S.: just noticed there already is a solution pointing out this error. I'll leave mine up here anyway, because of the suggestions how to fix it.
 
Share this answer
 
v2
Compiling does not mean your code is right! :laugh:
Think of the development process as writing an email: compiling successfully means that you wrote the email in the right language - English, rather than German for example - not that the email contained the message you wanted to send.

So now you enter the second stage of development (in reality it's the fourth or fifth, but you'll come to the earlier stages later): Testing and Debugging.

Start by looking at what it does do, and how that differs from what you wanted. This is important, because it give you information as to why it's doing it. For example, if a program is intended to let the user enter a number and it doubles it and prints the answer, then if the input / output was like this:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Then it's fairly obvious that the problem is with the bit which doubles it - it's not adding itself to itself, or multiplying it by 2, it's multiplying it by itself and returning the square of the input.
So with that, you can look at the code and it's obvious that it's somewhere here:
C#
int Double(int value)
   {
   return value * value;
   }

Once you have an idea what might be going wrong, start using the debugger to find out why. Put a breakpoint on the first line of the method, and run your app. When it reaches the breakpoint, the debugger will stop, and hand control over to you. You can now run your code line-by-line (called "single stepping") and look at (or even change) variable contents as necessary (heck, you can even change the code and try again if you need to).
Think about what each line in the code should do before you execute it, and compare that to what it actually did when you use the "Step over" button to execute each line in turn. Did it do what you expect? If so, move on to the next line.
If not, why not? How does it differ?
Hopefully, that should help you locate which part of that code has a problem, and what the problem is.
This is a skill, and it's one which is well worth developing as it helps you in the real world as well as in development. And like all skills, it only improves by use!
 
Share this answer
 
Comments
Stefan_Lang 28-Oct-19 6:42am    
'Compiling does not mean your code is right!'
It doesn't even compile - missing return statement!
[no name] 28-Oct-19 7:02am    
Some c/c++ compilers do give only a warning when one forgets to return the value. And what I observed: in case the return value is a double it crashes sooner or later.
Stefan_Lang 28-Oct-19 7:29am    
Well, the code here doesn't even use the return value. So you could argue that it isn't strictly needed.

I'd still argue that a function should return a value at least on one of it's control paths, if it declares a return type. If the return value is optional, it might be ok not to return something on some control path, but if nothing gets returned at all, that's clearly an indication that either the return type should be void, or a return statement is missing. If a compiler doesn't issue an error in that case, that'd be a bad compiler (or compiler setting).

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900