Suche Funktion

Message
Author
Boron

Suche Funktion

#1 Post by Boron »

Hallöchen zusammen,

ich bin gerade dabei ein Konsolenprogramm für Dos nach Linux zu portieren. In den Quellen ist jetzt nur noch eine Funktion namens "__itoa" (integer to ascii), die dem gcc nicht gefällt (Dos-Quellen wurden unter Visual C++ erstellt).
Gibt es unter Linux eine vergleichbare Funktion, da __itoa wohl nur unter Windows existiert auf MS's Mist gewachsen scheint?

Thanks in advance

Boron

Sebastian Ude

Re: Suche Funktion

#2 Post by Sebastian Ude »

Mach halt soetwas in der Art:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">char * my_itoa(int number)
{
char *result = malloc(20);
if (result != NULL)
snprintf(result, 20, "%d", number);
return result;
}</font><hr></pre></blockquote>


> da __itoa wohl nur unter Windows
> existiert auf MS's Mist gewachsen scheint ?

ANSI ist es auf keinen Fall <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Suche Funktion

#3 Post by hjb »

Hi,

laß die beiden Underscores weg (MS-Dummheit), und schon sollte es auch unter Linux klappen.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Jochen

Re: Suche Funktion

#4 Post by Jochen »

@hjb:

Das habe ich zuerst auch gedacht, ist aber nicht. Wahrscheinlich denkst Du gerade an atoi() (wie ich auch zuerst). Zu itoa habe ich aber keine man-Page oder sonst eine Referenz gefunden, selbst ein

find /usr/include -name "*.h" -print | xargs grep itoa

war ergebnisfrei. Sebastian hat schon recht...

Jochen

andy
Posts: 150
Joined: 07. Nov 1999 12:51
Location: Kiel
Contact:

Re: Suche Funktion

#5 Post by andy »

Du mußt noch eine Headerdatai mit einbinden.
Das müßte eigentlich die stdlib.h oder die string.h sein.
Dann sollte es gehen.
Kann leider gerade nicht nachschauen, da ich hier keine Linuxkiste habe.

andy
Posts: 150
Joined: 07. Nov 1999 12:51
Location: Kiel
Contact:

Re: Suche Funktion

#6 Post by andy »

Fällt mir gerade noch ein. Es könnte auch die ctype.h sein.

Sebastian Ude

Re: Suche Funktion

#7 Post by Sebastian Ude »

@ Andreas

Zumindest bei glibc 2.2.3 gibt es definitiv *keine* itoa-Routine, wie ein rekursives grep über die Headers (genau wie bei Jochen) ergab - da kannst du includen was du willst, hilft alles nichts.

Man muss dazu auch wissen, dass itoa soweit ich weiss weder ANSI noch POSIX ist (sonst wäre es auch in der glibc implementiert worden).

Die Funktion ist aber selber nicht allzu schwer zu implementieren (s.o).

aby

Re: Suche Funktion toascii ();

#8 Post by aby »

da gäbe es noch toascii (); ich glaube in ctype.h

Sebastian Ude

Re: Suche Funktion

#9 Post by Sebastian Ude »

man toascii

[...]

<b>int</b> (!) toascii (int c);


<b>DESCRIPTION</b>

<i>toascii() converts c to a 7-bit unsigned char value that fits into the ASCII character set, by clearing the high-order bits.</i>

[...]

Ist nicht ganz das was wir suchen.

Ich bleib immer noch bei snprintf.

Boron

Re: Suche Funktion

#10 Post by Boron »

Hi,

irgendwie hat das mit "snprintf" nicht hingehauen, also hab ich mir selbst was Wildes gebastelt.
Trotzdem danke.

Gruss Boron

Sebastian Ude

Re: Suche Funktion

#11 Post by Sebastian Ude »

@ Boron

Ein häufig gemachter Fehler bei einer eigenen itoa-Implementierung ist soetwas:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">char* itoa(int number)
{
char result[20];
snprintf(result, 20, "%d", number);
return result;
}</font><hr></pre></blockquote>

Das ist falsch, falsch, falsch und nocheinmal falsch.

Denn das Array wird beim Austreten aus der Routine zerstört, und folglich ist es undefiniert, auf was die zurückgegebene Adresse danach zeigt - aber auf jeden Fall *nicht* auf das Array !


Folglich ist es wichtig, dass man den Speicher wirklich durch malloc allociert und selbstverständlich überprüft, ob die Allocierung erfolgreich war.

Ganz gute Programmierer können jetzt noch argumentieren, dass man die in meinem Beispiel fest definierte Grösse von 20 Zeichen (abzüglich NULL-Character) für die Representierung eines int-Wertes auf andere Art und Weise verlässlich herausfinden könnte - aber auf die 7, 8 Bytes kommts nun auch nicht an <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.

brotzi

Re: Suche Funktion

#12 Post by brotzi »

Man kann auch

static char buf[10];

angeben!

Kyle

Re: Suche Funktion

#13 Post by Kyle »

int itoa(int number, char* array)
{
...
}

ist auch nicht schlecht dann geht man auf nummer sicher das array schon von ausserhalb der funktion angelegt wurden ist und so keine missverständnisse bei der specher allokierung besteht.

Bei dem Vorschlag:

char* itoa(int number)
{
static char result[20];
snprintf(result, 20, "%d", number);
return result;
}

und was macht die funktion wenn jemand free(result) macht? dann schlägt jede weiterer versuch fehl, wenn die funktion ausgeführt wird. Oder was passiert bei

char* foo1;
char* foo2;

foo1 = itoa(10);
foo2 = itoa(20);

Der speicher von foo1 <b> und </b> foo2 ist verändert.

Bei char* itoa(int number) wer löscht den Speicher der dabei anfällt? Das ist so nicht klar.

Sebastian Ude

Re: Suche Funktion

#14 Post by Sebastian Ude »

> Bei char* itoa(int number) wer löscht den
> Speicher der dabei anfällt? Das ist so
> nicht klar.

Der Programmierer.

Alternativ kann man ein itoa ja auch als Makro implementieren und alloca statt malloc benutzen, dann spart man sich die Speicher-Freigabe-Frage.

Boron

Re: Suche Funktion

#15 Post by Boron »

Oh Mann, vier Semester Studium "Technische Informatik", und ich Depp mach genau den Fehler den Sebastian Ude ankreidet.
Klar wird das result array zerstört wenn ich auf die malloc Version verzichte. Wie konnte ich nur so blöd sein (*kopfpaarmalgegentischschlag*).

Gruss Boron

Post Reply