fehlersuche itoa();, grundlagen



  • hallo
    kann mir jedmand sagen wie man unten stehendes source code zum laufen bringt?

    #include <iostream>
    #include <string>
    #include <libsocket.h>
    #include <pthreads.h>
    using namespace std;
    using namespace Network;
    
    int main( int argc, char * argv[] )
    {
      int i = ((50*256+66)*256) *256+52;
      char c1[9];
      c1 = itoa(i, c1, 10);
      char c2[4] = 'a';
      memcpy((int*)c2,(int*)i,4);
      cout << c2 <<endl;
      string s1(c2);
      int j = htonl(i);
      string s2;
      return 0;
    }
    

    zb: was ist an

    c1 = itoa(i, c1, 10);
    

    falsch?

    so sehen jedenfalls beispiele bei einem programmier test aus und dann heissts halt fehlersuche und korrektur und fragen dazu beantworten, da der test nun schon vorbei ist und es einen nachtest gibt, logischerweise gleich in der nächsten programmierstunde versuche ich nun das test bsp im nachinein noch zu verstehen, aber es gelingt mir bishe rund würd mich freuen wenn mir hier jemand weiter helfen könnte



  • itoa gibts nicht im C oder C++ Standard.



  • An itoa ist zum Beispiel falsch, es überhaupt zu verwenden. Da du im C++ Forum postest, empfehl ich dir mal die Klasse std::stringstream anzuschauen.

    Btw.: Der Bereich von int geht etwa von -32.000 bis 32.000. Also ist das wohl nicht der richtige Datentyp für deine Rechnung in der ersten Zeile.



  • Der Bereich von int geht etwa von -32.000 bis 32.000.

    Ja ne is klar. Visual Basic Programmierer?



  • *datentyp-unterscheidungs-brille aufsetz* ah 🙂



  • unasdf schrieb:

    itoa gibts nicht im C oder C++ Standard.

    aha, naja in der schule haben wir es einfach so verwendet, nur finde ich das programm greade nicht wirklich(ka obs beim c++ builder irgendwie dabei ist)

    wenn ich jedenfalls unteres bsp probiere (vorher da printf auf cout umändern..) dann funzt es, und ich weiss das itoa von int nach char umwandelt und man durch ändern des radix noch zwischen binär, octal, hex und dezimal umwandeln kann, nur weiss ichd as eben nur theoretisch und net praktisch um zu verstehen was iin meinem ersten post falsch ist

    Beispiel:
    
    #include <stdlib.h>
    #include <stdio.h>
    
    void main (void)
    {
      int zahl = -123456789L;
      char string[25];
    
      ltoa (zahl, string, 10);
      printf ("Zahl = %ld String = %s\n", zahl, string);
    }
    

    cin schrieb:

    An itoa ist zum Beispiel falsch, es überhaupt zu verwenden. Da du im C++ Forum postest, empfehl ich dir mal die Klasse std::stringstream anzuschauen.

    Btw.: Der Bereich von int geht etwa von -32.000 bis 32.000. Also ist das wohl nicht der richtige Datentyp für deine Rechnung in der ersten Zeile.

    aha, solche sachen verwenden wir nicht wirklich in der schhule
    und die rechnung oben soll irgend einen ASCII code ergeben, da wir etwas in einer ASCII tabelle nachschauen sollten

    LOL! schrieb:

    Der Bereich von int geht etwa von -32.000 bis 32.000.

    Ja ne is klar. Visual Basic Programmierer?

    gilt die frage mir?
    nein c++ anfänger netzwerkprogrammierung



  • Die Größe von int ist nicht im Standard festgelegt, und von der darunterliegenden Plattform abhängig. Die Zeiten, in denen int nur Werte zwischen -32768 und 32767 annahm, sind aber seit etwa 10 Jahren vorbei, in aller Regel nimmt int heute Werte zwischen +- 2 Milliarden und ein bisschen an. (-2^31 bis 2^31 - 1). Generell ist allerdings nur garantiert, dass

    sizeof(short) <= sizeof(int) <= sizeof(long)
    

    Was den Code angeht,

    int zahl = -123456789L;
    

    ist Blödsinn. Zwar kann int -123456789 annehmen, aber -123456789L ist explizit ein long-Literal. Obwohl die meisten Compiler das wahrscheinlich sogar fressen und nur ne Warnung ausspucken würden. Am ursprünglichen Code ist folgendes falsch:

    char c1[9];
      c1 = itoa(i, c1, 10);
    

    zum einen ist c1 9 Zeichen lang, nicht 10, also hast du da potentiell nen Buffer-Overflow drin, zum anderen ist c1 ein Array und kein Pointer, und daher in der Form als lvalue nicht zu benutzen. Richtig wäre

    char c1[10];
    itoa(i, c1, 10);
    

    wobei es sich da empfiehlt,

    char c1[10];
    itoa(i, c1, sizeof(c1));
    

    zu schreiben. Außerdem ist zu sagen, dass itoa nicht im C++-Standard enthalten ist und sowieso eher C-artig aussieht. Für meinen Geschmack wäre die saubere Lösung, stringstreams zu benutzen, also

    #include <iostream>
    #include <sstream>
    #include <string>
    
    int main() {
      int zahl = -123456789;
      std::ostringstream os;
      std::string s;
    
      os << zahl;
      s = os.str();
    
      std::cout << "Zahl: " << zahl << ", String: " << s << std::endl;
    }
    


  • also das mit der zahl hab ich aus nem bsp aus dem internet

    gut das mit dem bufferoverflow verstehe ich dass es so nicht geht wenn man mehr in weniger reinhaben will
    und "zum anderen ist c1 ein Array und kein Pointer, und daher in der Form als lvalue nicht zu benutzen." bezieht sich auf die zuweisung oder?

    ich hab jetzt jedenfalls bisschen herumprobiert

    string x = itoa(i, c1, 10);  //es funktioniert nur so, aber warum, es sollte doch mit char gehen oder?
    char x= itoa(i, c1, 10);    //funzt nicht, weiss nicht warum
    int x=  itoa(i, c1, 10);    //funzt nicht, klar, weil ich in ne int char reingeben will
    

    (hier sieht man dass eben diese grundlagen fehlen)

    und was stringstreams sind weiss ich nicht, bzw verwenden wir sie in der schule nicht

    bitte helfen!?!?!?



  • versuch's mal mit "char*x=itoa(...);" (die Funktion gibt afaik einen Pointer auf char zurück).


Anmelden zum Antworten