[c] atoi fehlerhaft

Java/CppProgrammer

Erfahrenes Mitglied
Irgentwie stimmt bei folgendem Programm nicht [

PHP:
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
  cout<<"geben sie eine Uhrzeit im Folgenden Format an   Stunden:Minuten\n";
  char zeit[5];
  cin>>zeit;
  cout<<zeit[0];
  cout<<zeit[1];
  cout<<zeit[2];
  cout<<zeit[3];
  cout<<zeit[4];
  cout<<zeit[5]<<'\n';
  int stunden=atoi(&zeit[0]);
  int minuten=atoi(&zeit[3]);
  cout<<stunden<<'\n';
  cout<<minuten<<'\n';
  }
Bei der Ausgabe die "cout" erzeugt ist noch alles richtig, aber stunden und minuten enthalten nach dem Aufruf von Atoi jeweils 2 Ziffern. Eigentlich sollte es doch nur die Zehnerziffer der Stunden und die der Minuten sein.
Arbeitet atoi falsch?
 
Java/CppProgrammer hat gesagt.:
Eigentlich sollte es doch nur die Zehnerziffer der Stunden und die der Minuten sein.
Arbeitet atoi falsch?

atoi transformiert einen String in einen Int, nicht nur einen Char, also mehr als ein Zeichen.

Mit "&zeit[0]" lieferst du eben einen Zeiger auf den Beginn des Strings, da sollte schon mehr als nur ein Zeichen interpretiert werden.

Übrigens wäre "zeit+0" gleichbedeutend nur eben schöner. (für 0 wäre natürlich "zeit" auch gleichbedeutend....)

Wenn du ein einzelnes Zeichen in einen Int umformen willst: verwende &15 oder -'0'
also
PHP:
char a = '6';
int f = a&15;  // f=6;
int g = a-'0';   // g=6;
 
Zuletzt bearbeitet:
Aber warum liefert atoi mir dann genau 2 Ziffern?
Ich habs mal umgeschrieben,dann wurd es noch kompilizierter:
char stundenzehner= zeit[0];
char stundeneiner= zeit[1];
int stunden=(10*atoi(&stundenzehner))+atoi(&stundeneiner);

Das sollte an sich funktionieren, weil atoi die Adresse eines chars erwartet, aber die Ausgabe ist nun völlig Konfus, sind die ersten beiden Indizies von Zeit z.B. 1 und 6 enthält stunden den Wert 7276.

EDIT: Danke für den Tipp mit &15 , aber für was steht 15?
 
atoi erwartet nicht die Addresse eines chars, sondern die eines Strings - mehrere aufeinanderfolgender chars !

Warum atoi je 2 Ziffern für Stunden und für Minuten liefert (das hat es doch, oder?) ?
Deine Eingabe sah wohl folgendermassen aus: hh:mm
atoi konvertierte bei deinem ersten Aufruf bis zum ersten ungültigen Zeichen -> dem Doppelpunkt
beim 2. Aufruf wieder das gleiche, nur bis zum '\0' Zeichen, da hat alles geklappt.
atoi konvertiert so lange alles, bis ein nicht-Zahlzeichen kommt (denk ich).
 
Die Zahlzeichen des Ascii-Zeichensatzes sind so gewählt, dass die '0' einen durch 16 teilbaren Wert hat, dann fortlaufend je um 1 mehr.
&15 ist binär & 00001111 oder hex &0xf
-> Die Bits, die relevant für den Wert einer 10er Ziffer sind, werden extrahiert.
-'0' sollte sich ja von selbst erklären.
 
Beichtpfarrer hat gesagt.:
atoi erwartet nicht die Addresse eines chars, sondern die eines Strings - mehrere aufeinanderfolgender chars !

Warum atoi je 2 Ziffern für Stunden und für Minuten liefert (das hat es doch, oder?) ?
Deine Eingabe sah wohl folgendermassen aus: hh:mm
atoi konvertierte bei deinem ersten Aufruf bis zum ersten ungültigen Zeichen -> dem Doppelpunkt
beim 2. Aufruf wieder das gleiche, nur bis zum '\0' Zeichen, da hat alles geklappt.
atoi konvertiert so lange alles, bis ein nicht-Zahlzeichen kommt (denk ich).
Achso, gut,danke
 
Zurück