String in Integer umwandeln

Schnelle objektorientierte, kompilierende Programmiersprache.
baule1
Beiträge: 5
Registriert: Mi Dez 03, 2008 6:01 pm

String in Integer umwandeln

Beitrag von baule1 » Mi Dez 03, 2008 6:10 pm

Hallo, bin neu hier und C- Anfänger und habe eine Frage:
Habe mir eine Funktion gebastelt (characterToInt), die einen vom Benutzer eingelesenen String (andere Funktion) an diese übergibt und zu einer Integerzahl konvertiert.

Code: Alles auswählen

int characterToInt(char *user_in_char)
{
  int out = 0;
  int sign_value =0;
  int count = strlen(user_in_char) - 1;
  double exponent = 0;
  
  if (strlen(user_in_char) > 11)
    return 0;

  for (count = strlen(user_in_char) - 1; count >= 0; count--)
  {
    
    if (isdigit(user_in_char[count]))  
    {
      sign_value = ((user_in_char[count] - '0') * pow(10, exponent));
      out = out + sign_value;
      exponent++;
    }

    else
      return 0;
  }
  
  return out;      
}
> 11 ist eine grobe Abschätzung nach oben, eine int kann ja max. 10 Stellen haben.

Jetzt wollte ich implementieren, dass die Zahl auch negative Werte annehmen kann (daher auch das 11).
Habe es mit Code wie

Code: Alles auswählen

    if (strncmp((user_in_char[0] - '0'), '-', 1))
               printf("negative Zahl\n");
in unterschiedlichen Varianten versucht... stehe grade an und bin über hilfe sehr dankbar...
lg, baule1

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: String in Integer umwandeln

Beitrag von nufan » Mi Dez 03, 2008 6:31 pm

Hi und willkommen im Forum :)

baule1 hat geschrieben:Jetzt wollte ich implementieren, dass die Zahl auch negative Werte annehmen kann (daher auch das 11).
Habe es mit Code wie

Code: Alles auswählen

if (strncmp((user_in_char[0] - '0'), '-', 1))
    printf("negative Zahl\n");
Welchen Compiler verwendest du denn? Der Syntax von strcmp stimmt nämlich nicht.
Hier der Link zur Referenz: http://proggen.org/doku.php?id=c:lib:string:strcmp

Code: Alles auswählen

user_in_char[0] - '0'
Durch -'0' bekommst du den Integer-Wert einer char-_Zahl_. Also wenn das Zeichen '1' (ASCII 49) ist, und dann '0' (ASCII 48) abgezogen wird bekommst du 1 (in ASCII). Gut - stimmt so.
Du ziehst jedoch '0' ab und vergleichst dann mit einem Zeichen. Sollte das Zeichen also wirklich '-' (ASCII 45) sein und du ziehst '0' ab, erhälst du -3...

So sollte es gehen:

Code: Alles auswählen

if (strncmp (user_in_char[0], '-') == 0)
Hoffe das war verständlich :)

baule1
Beiträge: 5
Registriert: Mi Dez 03, 2008 6:01 pm

Re: String in Integer umwandeln

Beitrag von baule1 » Mi Dez 03, 2008 6:39 pm

verständlich wars auf alle fälle, danke für die flotte hilfe.

zum compilieren verwende ich gcc - im übrigen ists kein wunder, dass das nicht die syntax von strcmp ist, es is ja auch strncmp :-).
wobei das in dem Fall wurscht wäre, da ja sowieso nur 1 Zeichen an der ersten Stelle des Arrays steht (oder täusch ich mich?).

werde deinen code in kürze ausprobieren :-)

baule1
Beiträge: 5
Registriert: Mi Dez 03, 2008 6:01 pm

Re: String in Integer umwandeln

Beitrag von baule1 » Mi Dez 03, 2008 6:51 pm

funktioniert leider nicht... 1.) warning: ... makes pointer of integer without a cast...
2.) hab ich das problem, dass ich, wenn ichs laufen lass, einen segmentation error krieg...

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: String in Integer umwandeln

Beitrag von Kerli » Mi Dez 03, 2008 7:03 pm

baule1 hat geschrieben:Hallo, bin neu hier und C- Anfänger und habe eine Frage:
Hallo, willkommen im Forum. Ich glaub wir sollten uns ja schon irgendwoher kennen ;)
dani93 hat geschrieben:So sollte es gehen:

Code: Alles auswählen

if (strncmp (user_in_char[0], '-') == 0)
baule1 hat geschrieben:funktioniert leider nicht...
Kein Wunder :) strncmp erwartet char* als Paramter und noch eine Anzahl der zu überprüfenden Zeichen. Richtig wäre also:

Code: Alles auswählen

if(  !strncmp (user_in_char, "-", 1) )
user_in_char ist einfach der Zeiger auf das erste Zeichen, also gleichwertig mit &user_in_char[0] und der zweite Parameter muss als String übergeben werden und nicht als char, dh also mit dem doppelten Anführungszeichen " und nicht mit dem einfachen '.

Und das ! finde ich einfach schöner als '== 0', ist aber eigentlich Geschmackssache.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

baule1
Beiträge: 5
Registriert: Mi Dez 03, 2008 6:01 pm

Re: String in Integer umwandeln

Beitrag von baule1 » Mi Dez 03, 2008 7:14 pm

ja, wir kennen uns... ich hab klarerweise an der stelle jetzt nicht strncmp verwendet, sonder strcmp... mal schauen, was dabei rauskommt, wenn ich das so mach, wie du (bisher waren deine tipps ja alle hilfreich)...

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: String in Integer umwandeln

Beitrag von nufan » Mi Dez 03, 2008 7:17 pm

baule1 hat geschrieben: zum compilieren verwende ich gcc - im übrigen ists kein wunder, dass das nicht die syntax von strcmp ist, es is ja auch strncmp :-)
*Augen auswisch* ach jetzt seh ichs auch :D
Eigentlich kannst du dir das mit str(n)cmp auch sparen, da du ja nur 1 Zeichen vergleichst.

Wozu ist exponent ein double? Kann doch höchstens 10 oder 11 sein. Also sollte ein int reichen ;)

Ich hab dein Programm jetzt etwas abgeändert, so ist es leichter zu testen.

Code: Alles auswählen

#include <stdio.h>  
#include <string.h>
#include <math.h>
#include <ctype.h>
   
int main()
{

  char user_in_char[] = {"-123"};
  int out = 0;
  int sign_value =0;
  int count = strlen(user_in_char) - 1;
  int p;
  int exponent = 0;
     
  if (strlen(user_in_char) > 11)
    return 0;

  if (user_in_char[0] == '-')
  {
    printf ("\n-");
    user_in_char[0] = '0';
  }

  for (count = strlen(user_in_char) - 1; count >= 0; count--)
  {
       
    if (isdigit(user_in_char[count])) 
    {
      p = pow(10, exponent);
      sign_value = ((user_in_char[count] - '0') * p);
      out = out + sign_value;
      exponent++;
    }

        else
          return 0;
  }
     
  printf ("%d\n", out);
     
  return 0;
           
}
Wichtig ist, dass im if in dem auf - geprüft das 1. Zeichen auf 0 gesetzt wird. Sonst multiplizierst du mit 45...
Jedenfalls funzt es bei mir. Willst du eine "echte" negative Zahl, also nicht einfach ein printf mit '-', dann musst du eine Variable die auf Minus prüft setzen, und wenn die am Ende des Unterprogrammes wahr ist, wird die Zahl mit -1 multipliziert.

Also etwa so:

Code: Alles auswählen

int negativ = 0;

...

  if (user_in_char[0] == '-')
  {
    negativ = 1;
    user_in_char[0] = '0';
  }

...

  if (negativ)
    out  *= -1; 

  return out;

baule1
Beiträge: 5
Registriert: Mi Dez 03, 2008 6:01 pm

Re: String in Integer umwandeln

Beitrag von baule1 » Mo Dez 08, 2008 9:31 am

bin gestern auf ein weiteres (sehr blödes!) problem draufgekommen, vielleicht habt ihr eine idee, mir sind sie nämlich ausgegangen...

hab zweimal den returnwert "0" angegeben; einmal wenn der benutzer mehr als 11 Zeichen eingibt, das andere mal, wenn er etwas eingibt, das keine zahl ist...
jetzt hab ich das problem: wenn der benutzer "0" eingibt, ist der wert, der variable "out", die ich zurückliefere, auch 0, sprich, wenn ich die funktion auf ihren Rückgabewert == 0 überprüfe, dann krieg ich ein problem, wenn der Benutzer 0 eingegeben hat... --> auf sowas kommt man als anfänger während des programmierens natürlich nicht... hab schon ausprobiert, einen char zu übergeben, was allerdings nicht geht, der hat ja auch den "wert" des ascii codes; dann hab ich versucht, mit EXIT_FAILURE zu arbeiten, das hat den wert 1; sprich, dann krieg ich ein problem, wenn der benutzer 1 eingibt.

bitte um hilfe... dankeschöne :-)

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: String in Integer umwandeln

Beitrag von Kerli » Mo Dez 08, 2008 11:09 am

baule1 hat geschrieben:bin gestern auf ein weiteres (sehr blödes!) problem draufgekommen, vielleicht habt ihr eine idee, mir sind sie nämlich ausgegangen...

hab zweimal den returnwert "0" angegeben; einmal wenn der benutzer mehr als 11 Zeichen eingibt, das andere mal, wenn er etwas eingibt, das keine zahl ist...
jetzt hab ich das problem: wenn der benutzer "0" eingibt, ist der wert, der variable "out", die ich zurückliefere, auch 0, sprich, wenn ich die funktion auf ihren Rückgabewert == 0 überprüfe, dann krieg ich ein problem, wenn der Benutzer 0 eingegeben hat...
In C kann man das leider nicht sehr schön machen. Aber es gibt eigentlich zwei Möglichkeiten:

1.) Du verwendest für deine Fehler einen Wert der sehr wahrscheinlich nie verwendet wird. Es ist nicht unüblich dafür den größten oder kleinsten Wert zu nehmen, den der Rückgabewert annehmen kann.

2.) Du führst noch einen weiteren Parameter ein, den du per-reference übergibst und in den du hineinschreibst ob eine gültige Ausgabe vorliegt.

Üblicherweise wird man in diesem Fall aber doch eher zu 1.) tendieren...
baule1 hat geschrieben:auf sowas kommt man als anfänger während des programmierens natürlich nicht
Aus so etwas lernt man am meisten. Ich glaub so schnell wird dir das nicht wieder passieren ;)
dani93 hat geschrieben:EXIT_FAILURE zu arbeiten, das hat den wert 1; sprich, dann krieg ich ein problem, wenn der benutzer 1 eingibt.
Siehe 1.) Wenn du es so machst, dann nur mit einem Wert der üblicherweise keiner normalen Eingabe entspricht.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8861
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: String in Integer umwandeln

Beitrag von Xin » Mo Dez 08, 2008 11:52 am

Kerli hat geschrieben:In C kann man das leider nicht sehr schön machen. Aber es gibt eigentlich zwei Möglichkeiten:

1.) Du verwendest für deine Fehler einen Wert der sehr wahrscheinlich nie verwendet wird. Es ist nicht unüblich dafür den größten oder kleinsten Wert zu nehmen, den der Rückgabewert annehmen kann.

2.) Du führst noch einen weiteren Parameter ein, den du per-reference übergibst und in den du hineinschreibst ob eine gültige Ausgabe vorliegt.
Von 1.) rate ich bei einfachen Datentypen, wie int oder float dringend ab. Da kann man gleich Bug als Kommentar dran schreiben. Heute funktionierts, in 2 Jahren denkt keiner dran und behandelt was immer er bekommt als Ergebnis.

Bleibt 2.)

In C:

Code: Alles auswählen

char div( int a, int b, int * result )
{
  if( b == 0 ) 
    return FALSE;

  *result = a / b;
  return TRUE;
}

int main( void )
{
  int ergebnis;
  int wert1 = 10;
  int wert2 = 5;

  if( div( wert1, wert2, &ergebnis ) )
  {
    /* alles super */
    printf( "Das Ergebnis ist %d\n", ergebnis );
  }
  else printf( "Division fehlgeschlagen; kein Ergebnis.\n" );
}
Etwas aufwendiger in der Verwendung, aber dafür eine klare Aufforderung an den Programmierer sich darum zu kümmern, wenn was schief geht.
In C++ gibt es eine etwas schönere Variante (und ich meine nicht Exceptions). Außerdem kann man dort bool (Wahrheitswert: hat's geklappt?) statt char (kleiner Datentyp) oder int oder was auch immer als Rückgabewert verwenden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten