2016-11-18 10 views
-3

バイナリ電卓を作った。それは機能しますが、数字が0から始まっていない場合にのみ、次のように表示されます:error pictureProbleem with substr with C++

どのようにプログラムを修復する必要がありますか?

while(vysledek[0] == '0') 
{ 
    vysledek = vysledek.substr(1, vysledek.length()); 
    w++; 
} 
int aa; 
aa = p-w; 
for(o; o < aa; o++) 
{ 
    cout << vysledek[o]; 
} 

トータルプログラム: `

#include <iostream> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <string> 

    using namespace std; 

    int main() 
    { 
     cout << "Zadejte dve binarni cisla:" << endl; 
     string cislo1, cislo2; 
     cin >> cislo1 >> cislo2; 

    int c = 0; 

    for (c; c < cislo1.length(); c++) 
    { 
     if ((cislo1[c] == '0') || (cislo1[c] == '1')) 
     { 
      continue; 
     } 
     else 
     { 
      cout << "Nespravny vstup."; 
      return 0; 
     } 
    } 

    int d = 0; 
    for (d; d < cislo2.length(); d++) 
    { 
     if ((cislo2[d] == '0') || (cislo2[d] == '1')) 
     { 
      continue; 
     } 
     else 
     { 
      cout << "Nespravny vstup."; 
      return 0; 
     } 
    } 


    string stringS2 = ""; 
    for(unsigned i = 0; i < cislo1.length(); i++) 
    { 
    stringS2 += cislo1[cislo1.length()-1-i]; 
    } 
    cislo1 = stringS2; 

    string stringS3 = ""; 
    for(unsigned i = 0; i < cislo2.length(); i++) 
    { 
    stringS3 += cislo2[cislo2.length()-1-i]; 
    } 
    cislo2 = stringS3; 

    /* 
    cout << cislo1 << endl; 
    cout << cislo2 << endl; 
    cout << cislo1.length() << endl; 
    cout << cislo2.length() << endl; 
    */ 

    int p; 
    if (cislo1.length() > cislo2.length()) 
    { 
     p = cislo1.length(); 
     int f = cislo2.length(); 
     for(f; f < cislo1.length(); f++) 
     { 
      cislo2[f] = '0'; 
     } 
    } 

    else 
    { 
     p = cislo2.length(); 
     int f = cislo1.length(); 
     for(f; f < cislo2.length(); f++) 
     { 
      cislo1[f] = '0'; 
     } 
    } 
    int e = 0; 

    //cout << p << endl; 

    string vysledek; 
    int t; 
    t = (p - 1); 

    cislo1[p]; 
    cislo2[p]; 
    for(e; e < p; e++) 
    { 
     /*nasledujici podminky jsou pro pripad, kdy cisla maji odlisny pocet znaku 
     if(cislo1[e] == NULL) 
     { 
      cislo1[e] == '0'; 
     } 
     if(cislo2[e] == NULL) 
     { 
      cislo2[e] == '0'; 
     }*/ 

     if (cislo1[e] == '0' && cislo2[e] == '0') 
      { 

       if ((cislo1[e-1] == '1' && cislo2[e-1] == '1')|| ((cislo1[e-1] == '0' && cislo2[e-1] == '1')&& vysledek[t+1] == '0') || ((cislo1[e-1] == '1' && cislo2[e-1] == '0')&& vysledek[t+1] == '0') || ((cislo1[e-1] == '1' && cislo2[e-1] == '1')&& vysledek[t+1] == '1')) 
       { 
        vysledek[t] = '1'; 
       } 
       else 
       { 
        vysledek[t] = '0'; 
       } 
       //cout << vysledek[t] << endl; 
       t--; 

      } 

     else if ((cislo1[e] == '1' && cislo2[e] == '0') || (cislo1[e] == '0' && cislo2[e] == '1')) 
      { 

       if ((cislo1[e-1] == '1' && cislo2[e-1] == '1') || ((cislo1[e-1] == '0' && cislo2[e-1] == '1')&& vysledek[t+1] == '0') || ((cislo1[e-1] == '1' && cislo2[e-1] == '0')&& vysledek[t+1] == '0') || ((cislo1[e-1] == '1' && cislo2[e-1] == '1')&& vysledek[t+1] == '1')) 
       { 
        vysledek[t] = '0'; 
       } 
       else 
       { 
        vysledek[t] = '1'; 
       } 
       // cout << vysledek[t] << endl; 
       t--; 
      } 

     else if (cislo1[e] == '1' && cislo2[e] == '1') 
      { 

       if ((cislo1[e-1] == '1' && cislo2[e-1] == '1') || ((cislo1[e-1] == '0' && cislo2[e-1] == '1')&& vysledek[t+1] == '0') || ((cislo1[e-1] == '1' && cislo2[e-1] == '0')&& vysledek[t+1] == '0') || ((cislo1[e-1] == '1' && cislo2[e-1] == '1')&& vysledek[t+1] == '1')) 
       { 
        vysledek[t] = '1'; 
       } 
       else 
       { 
        vysledek[t] = '0'; 
       } 
       //cout << vysledek[t] << endl; 
       t--; 
      } 
    } 
    cout << "Soucet: "; 
    int u; 
    u = (p - 1); 
    if(((cislo1[u] == '0' && cislo2[u] == '1')&& vysledek[0] == '0') || ((cislo1[u] == '1' && cislo2[u] == '0')&& vysledek[0] == '0') || (cislo1[u] == '1' && cislo2[u] == '1')) 
    cout << '1'; 


    int o = 0; 
    int z; 
    int w = 0; 
    while(vysledek[0] == '0') 
    { 
     vysledek = vysledek.substr(1, vysledek.length()); 
     w++; 
    } 
    int aa; 
    aa = p-w; 
    for(o; o < aa; o++) 
    { 
     cout << vysledek[o]; 
    } 





    return 0; 
} 

`

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+1

コマンドプロンプトウィンドウの写真を撮り、それをimgurに投稿し、ここにリンクするのは、そこからテキストをコピー&ペーストするよりも簡単ですか? –

+0

@DanKorn There doesnt work ctrl + c – Tux

答えて

1

string vysledek;が空の文字列を作成するのsubstrとコードの パート(vysledek結果を意味します)。他のサイズは決して与えられません。

vysledek[t]およびvysledek.substrのすべての使用はすべて範囲外です。

+0

ボ・ペルソンOKしかし、なぜ1で始まる数字のプログラムが動作するのですか? – Tux

+2

'e'がゼロのときに' cislo1 [e-1] 'が範囲外になるのでおそらくしないでしょう。プログラムの未定義の動作の可能な結果の1つは、「うまくいく」と考えられることに注意してください。 –