naruszenie ochrony pamięci

0

witam!

czy mógłbym prosić o wyjaśnienie, dlaczego w tym programiku występuje błąd naruszenia ochrony pamięci??

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int wielkosc;
int* kod();
string szyfrowanie();
string deszyfrowanie();

//===================================
int main(int argc, char **argv) {
    
  const string szyfruj = "SZYFRUJ";
  const string deszyfruj = "DESZYFRUJ";
  
  string in;
  
  cin >> in;
  
  if(in == szyfruj)
    
    szyfrowanie();
  else if(in == deszyfruj)
    deszyfrowanie();
  else
    return 0;
  
  
    return 0;
}
//=================================== 
//=================================== szyfrowanie
string szyfrowanie(){

  int *wsk_kod = kod();
  
  string sText;
  cin >> sText;
  
  for(int i = 0, j = 0; i < sText.size(); i++, j++){	// pętla szyfrująca
    if(j >= wielkosc)
      j = 0;
   
    if((sText[i] + wsk_kod[j]) > 90){
      int reszta = (sText[i] + wsk_kod[j]) - 91; 
      sText[i] = 65 + reszta;
    }
    else
      sText[i] += wsk_kod[j];
  }
  
  cout << sText << endl;
  delete [] wsk_kod;
}
//=================================== deszyfrowanie
string deszyfrowanie(){
  
  int *wsk_kod = kod();
  
  string sText;
  cin >> sText;
  
  for(int i = 0, j = 0; i < sText.size(); i++, j++){	// pętla szyfrująca
    if(j >= wielkosc)
      j = 0;
    if((sText[i] - wsk_kod[j]) < 65){
      int reszta = 64 - (sText[i] - wsk_kod[j]);
      sText[i] = 90 - reszta;
    }
    else
      sText[i] -= wsk_kod[j];
  }
  
  cout << sText << endl;
  delete [] wsk_kod;
}
//=================================== kod
int* kod(){
  string s;
  stringstream ss;
  
 cin >> s;
 wielkosc = s.size();
 int *liczba = new int[wielkosc];
 
 for(int i = 0; i < wielkosc; i++){
   ss.str("");
   ss.clear();
   ss << s[i];
   ss >> liczba[i];
 }
  return liczba;
} 
0

no też tak myślę ... ale nie wiem gdzie się to może dziać ;/ w którym miejscu

0

Zapewne sięgasz poza pamięć programu, w Twoim przypadku zapewne gdzieś przy indeksie tablicy. Printuj sobie każde i oraz j zanim sięgniesz do tablicy.

0

i oraz j wyglądają dobrze.
czy może z działaniami coś jest źle a ja tego nie widzę ??
np tu:

    if((sText[i] - wsk_kod[j]) < 65){
      int reszta = 64 - (sText[i] - wsk_kod[j]); 
2

Ale czemu po prostu nie uruchomisz tego pod debugerem?

0

po modyfikacji programiku wg wskazówek @Visher wszystko działa dobrze.

 #include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int wielkosc;
int* kod(string s);
void szyfrowanie(string &sText, int *kod);
void deszyfrowanie(string &sText, int *kod);
 
//===================================
int main(int argc, char **argv) {
 
  const string szyfruj = "SZYFRUJ";
  const string deszyfruj = "DESZYFRUJ";
 
  string in;
 
  cin >> in;
 
  if(in == szyfruj){
          string sKod;
          cin >> sKod;
          string s;
          cin >> s;
    szyfrowanie(s, kod(sKod));
  }
 
  else if(in == deszyfruj){
          string sKod;
          cin >> sKod;
          string s;
          cin >> s;
    deszyfrowanie(s, kod(sKod));
  }
  else
    return 0;
 
    return 0;
}
//===================================
//=================================== szyfrowanie
void szyfrowanie(string &sText, int *kod){
  for(int i = 0, j = 0; i < sText.size(); i++, j++){    // pętla szyfrująca
    if(j >= wielkosc)
      j = 0;
 
    if((sText[i] + kod[j]) > 90){
      int reszta = (sText[i] + kod[j]) - 91;
      sText[i] = 65 + reszta;
    }
    else
      sText[i] += kod[j];
  }
 
  cout << sText << endl;
  delete [] kod;
}
//=================================== deszyfrowanie
void deszyfrowanie(string &sText, int *kod){
  for(int i = 0, j = 0; i < sText.size(); i++, j++){    // pętla szyfrująca
    if(j >= wielkosc)
      j = 0;
    if((sText[i] - kod[j]) < 65){
      int reszta = 64 - (sText[i] - kod[j]);
      sText[i] = 90 - reszta;
    }
    else
      sText[i] -= kod[j];
  }
 
  cout << sText << endl;
  delete [] kod;
}
//=================================== kod
int* kod(string s){
  stringstream ss;
 
  wielkosc = s.size();
 int *liczba = new int[wielkosc];
 
 for(int i = 0; i < wielkosc; i++){
   ss.str("");
   ss.clear();
   ss << s[i];
   ss >> liczba[i];
 }
  return liczba;
}

mam jednak pytanie, czy istnieje coś takiego, że funkcja kod(string s) może pobierać int ??
Chodzi mi o to czy jest jakaś funkcja, która rozkłada dużą liczbę typu int na pojedyncze cyfry?

1 użytkowników online, w tym zalogowanych: 0, gości: 1