[C++] Mi a hiba ebben az atoi () -val?
Valamiért rosszul konvertálok:S Tudna valaki segíteni? (Am a program két kettesszámrendszerbeli számot ad össze.)
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
void str_beker(string &x, string szam);
void resize(string &x, string &y);
void sum(string x, string y, string &z);
int main()
{
string x,y;
str_beker(x,"elso");
str_beker(y,"masodik");
resize(x,y);
sum(x,y,z);
cout<<z<<endl;
return 0;
}
void str_beker(string &x, string szam){
cout<<"Add meg a(z) "<<szam<<" szamot!"<<endl;
getline(cin,x);
}
void resize(string &x, string &y){
if(x.size()>y.size()){
y.insert(0,x.size()-y.size(),'0');
}else if(y.size()>x.size()){
x.insert(0,y.size()-x.size(),'0');
}
}
void sum(string x, string y, string &z){
int atv=0;
for(int i=0;i<x.size()+1){
z[i]="0";
}
for(int i=x.size();i>0;i--){
if(atoi(x[i].c_str())+atoi(y[i].c_str())+atv==0){
z[i]="0";
atv=0;
}else if(atoi(x[i].c_str())+atoi(y[i].c_str())+atv==1){
z[i]="1";
atv=0;
}else if(atoi(x[i].c_str())+atoi(y[i].c_str())+atv==2){
z[i]="0";
atv=1;
}else if(atoi(x[i].c_str())+atoi(y[i].c_str())+atv==3){
z[i]="1";
atv=1;
}
}
if(z[z.size()-1]=="0"){
z.erase(z.size()-1,1);
}
}
A helpért előre is köszi(:
Ránézésre sem fordul le. A hibaüzenet elég beszédes lehet. Elemezzünk!
x[i].c_str()
Mi is ez a kifejezés? Van benne x, ami string, van benne i, ami int, van benne egy operator[] ami az egyes karaktereket éri el a stringben és van benne c_str, ami memberfüggvénynek néz ki. Minek van c_str memberfüggvénye? Például a stringnek. Mi az x[i] típusa? Lásd fent: karakter. Van a karakternek c_str függvénye? Nincs, nem osztály, nincs memberfüggvénye.
A megoldás itt lesz: hogy csinálsz '0' és '1' karakterekből 0-t és 1-t? Sok módja van, találj ki egyet. Az atoi-t meg felejtsd el ehhez a feladathoz.
Ha valaki még erre járna:
Átalakítottam tűrhetőre, lefut, viszont valamiért elakad, valami tipp?
#include <iostream>
using namespace std;
void str_beker(string &x, string szam);
void resize(string &x, string &y);
void sum(string x, string y, string &z);
int main()
{
string x,y,z;
str_beker(x,"elso");
str_beker(y,"masodik");
resize(x,y);
sum(x,y,z);
cout<<z<<endl;
return 0;
}
void str_beker(string &x, string szam){
cout<<"Add meg a(z) "<<szam<<" szamot!"<<endl;
getline(cin,x);
}
void resize(string &x, string &y){
if(x.size()>y.size()){
y.insert(0,x.size()-y.size(),'0');
}else if(y.size()>x.size()){
x.insert(0,y.size()-x.size(),'0');
}
}
void sum(string x, string y, string &z){
//charcode 48->0 49->1
int atv=0;
for(int i=0;i<x.size()+1;i++){
z[i]+='0';
}
for(int i=x.size();i>0;i--){
if((x[i]-48)+(y[i]-48)+atv==0){
z[i]='0';
atv=0;
}else if((x[i]-48)+(y[i]-48)+atv==1){
z[i]='1';
atv=0;
}else if((x[i]-48)+(y[i]-48)+atv==2){
z[i]='0';
atv=1;
}else if((x[i]-48)+(y[i]-48)+atv==3){
z[i]='1';
atv=1;
}
}
if(atv==1){
z[0]='1';
}else{
z.erase(0,1);
}
}
Próbáld egyrészt cerr-el kiírni (az nem buffereli a kiírást), másrészt a ciklusodban x.size()-tól indul az i, és te megindexeled x-t i-vel, ez biztos, hogy túlindexelés.
Ez meg:
if(z[z.size()-1]=="0"){
soha nem lesz igaz, chart hasonlítasz char[]-vel, le se kéne fordulnia.
Nagyon nemmélyedtem bele a kódodba, de ha string "változót" használsz, szerintem ez biztosan hiányzik:
#include <string>
Introduction to strings
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!