2016-11-18 3 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 저기 ctrl + c를 – Tux

답변

1

string vysledek;는 빈 문자열을 생성 SUBSTR와 코드의 부 (vysledek는 결과를 의미한다). 다른 크기는 결코 주어지지 않습니다.

vysledek[t]vysledek.substr의 모든 사용은 모두 범위를 벗어납니다.

+0

보 페르손 OK.하지만 1로 시작하는 번호의 프로그램이 작동하는 이유는 무엇입니까? – Tux

+2

'e'가 0 일 때'cislo1 [e-1]'이 범위를 벗어날 것이기 때문에 아마 그렇지 않을 것이다. 프로그램에서 정의되지 않은 동작의 가능한 결과 중 하나가 "작동하는 것"입니다. –