2017-10-19 4 views
0

Mit meinem Programm muss ich die enthaltene Zahl in eine Zeichenfolge zurückgeben Mein Programm scheint zu arbeiten, aber um sicher zu sein, muss ich die Nummer anzeigen. Die Sache ist, es sieht aus wie es in ascii stecken ist Zum Beispiel, wenn meine Nummer 12 ist, kann ich nur 1068 anzeigen Ich möchte Tipps in der Lage sein, mit der printf oder write-Funktionen die Zahl in der Zeichenfolge enthalten " abcd12 ". Wie dem auch sei , hier ist mein Programm (Wich normalerweise den Wert von nbr zeigt, Iteration pro Iteration und seinen Endwert in den Haupt):Zeichen String zu Integer

int my_getnbr(char const *str) { 
    int i = 0; 
    int nbr; 
    int power = 1; 

    while (str[i] != '\0') { 
      if (str[i] <= '9' && str[i] >= '0') { 
        nbr = nbr * power + str[i] + '0'; 
        printf("%d\n", nbr); 
        power = power * 10; 
      } 
      i++; 
    } 

    return (nbr); 
} 

int main() { 
    int nbr; 

    nbr = my_getnbr("abcd12"); 
    printf("nbr = %d\n", nbr); 

    return (0); 
} 
+1

Dies zeigt undefiniertes Verhalten, da 'nbr' nie initialisiert wird. – hnefatl

+1

'int nbr = 0; ... nbr = nbr * 10 + (str [i] - '0'); 'Subtrahieren '' 0'' (keine Notwendigkeit für 'power') – chux

+1

Sie setzen' +' 0'' anstelle von '- '0 "". Wählen, um als Tippfehler zu schließen. – dasblinkenlight

Antwort

1

Ihr Konzept ist gut, nur ein wenig Feinabstimmung.

  • Sie haben nbr nicht festgelegt. Initialisiere es auf Null, damit du einen bekannten Startpunkt hast.
  • Keine Notwendigkeit für power. Multiplizieren Sie einfach Ihre Nummer mit jeder Iteration um zehn.
  • Und das Schlüsseldetail: '0' ist ein ASCII-Zeichen. Wenn auf eine ganze Zahl konvertieren, passiert es die Zahl 48 Versuchen, dies:

    nbr = nbr * 10 + str[i] - '0'; 
    

Die klar ist die Absicht, die Hardcodes eher als ein Wert, was bedeutet, und sollen Sie über das Ziel bekommt Linie.

Ein kleiner Hinweis:

  • Für Code Klarheit, deutet darauf hin, wie ein Mathematiker denken, wenn Bereichswerte zu vergleichen. Sie haben

    if (str[i] <= '9' && str[i] >= '0') { 
    

    , die nicht falsch ist, sondern nimmt eine mentale zweite „ah sagen, wenn es sich um eine ASCII-Ziffer ist Während, wenn Sie neu geordnet wie:.

    if ('0' <= str[i] && str[i] <= '9') { 
    

    die Symmetrie natürlicher ist, und visuell Orte die Variable Sie testen zwischen die Grenzen. Ein kleines Detail, das in anekdotische Erfahrung Angelegenheiten.

+0

'0' <= str [i] schrecklichen Stil. Hasse es –

+1

@ PeterJ_01 du wärst nicht der erste. Und kein schrecklicher Stil, besonders in C. Ein anderer Stil, als Sie vielleicht bevorzugen. Betrachten Sie [Primat des Lernens] (https://en.wikipedia.org/wiki/Principles_of_learning#Prityity) als einen Grund, warum ich es mag und Sie es hassen. Aber klar, es gibt nur einen "richtigen" Weg, es zu tun. "Auf meine Art!";-) – hunteke

+0

aber dieser Code wird sowieso nicht funktionieren. –

-1

kann reduziert werden auf:

nbr = 0; 
while (*str) { 
     if (isdigit(*str)) 
     { 
       nbr *= 10; 
       nbr += *str++ - '0'; 
     } 
}