2016-04-08 4 views
2

Für meine Programmierklasse, ich versuche, eine Funktion incrementString() schreiben, die die Zeichenfolge "Str" von einem Treiber übergeben, und fügt eins zu ihnen. Es sollte mit Buchstaben und Zahlen funktionieren (zB "1" geht mit "2", "a" mit "b", "z" mit "aa", "ZZ" mit "AAA"). Ich habe fast alle Testbedingungen, bis auf einen Fehler, den ich nicht finden kann.String Inkrementierende Funktion in C

Das ist, was ich habe zur Zeit:

void incrementstring(char* str){ 
int i; 
int j; 
int length = strlen(str); 
for(i = strlen(str)-1; i >= 0; i--){ 
    if (str[i] == '9'){ 
      str[i] = '0'; 
      if (str[0] == '0'){ 
        for (j = strlen(str)-1; j>=0; j--){ //This loop is the problem 
          str[j+1] = str[j]; 
          } 
        str[0] = '1'; 
        } 
    } 
    else if (str[i] == 'z'){ 
      if (str[0] == 'z'){ 
        str[i] = 'a'; 
        str[i+1] = 'a'; 
        } 
      str[i] = 'a'; 
      } 

    else if (str[i] == 'Z'){ 
      if(str[0] == 'Z'){ 
        str[i] = 'A'; 
        str[i+1] = 'A'; 
      } 
      str[i] = 'a'; 
    } 
    else{ 
      str[i]++; 
      return; 
    } 

} 
} 

Wenn ich die Funktion ausführen, das, was gibt die Treiber:

1. testing "1"... = 2. Correct! 
2. testing "99"... = 100. Correct! 
3. testing "a"... = b. Correct! 
4. testing "d"... = e. Correct! 
5. testing "z"... = INCORRECT: we got "aa0". We should be getting "aa" instead. 
6. testing "aa"... = ab. Correct! 
7. testing "Az"... = Ba. Correct! 
8. testing "zz"... = aaa. Correct! 
9. testing "cw"... = cx. Correct! 
10. testing "tab"... = tac. Correct! 
11. testing "500"... = 501. Correct! 

11 tests run. 

ich eine for-Schleife in Zeile 9 schrieb "zu handhaben die 99 'bis' 100 'Zustand. Es nimmt jeden Index der Zeichenfolge und verschiebt es nach rechts, und fügt dann eine '1' an den Anfang der Zeichenfolge. Diese Schleife bringt jedoch aus irgendeinem Grund die fünfte Testbedingung durcheinander, wie oben zu sehen ist. Wenn ich die Schleife herausnehme, wird "99" auf "00" gehen, aber der 5. Test wird ohne Probleme bestehen. Ich habe hier eine Mauer getroffen und ich habe mich gefragt, ob irgendjemand einen Einblick geben kann.

Ich schätze die Hilfe, danke.

+8

Nach Ihrem "Übertrag" (dh, wenn Sie die "Zeichenfolge" erweitern), müssen Sie ein NUL-Abschlussbyte im Array hinzufügen. Alle 'str [i + 1] =' sollten nach ihnen ein 'str [i + 2] = '\ 0' haben. Sie erkennen auch, dass Sie ASCII-Zeichensatz annehmen, richtig? Oder ist diese Rücksichtnahme über den Rahmen der Klasse hinaus? – mpez0

+0

Die Verwendung eines Debuggers könnte auch hier hilfreich sein. –

+0

Ihr "carry" funktioniert nicht in allen Fällen: Versuchen Sie 'zaz' einzugeben - Das sollte sich in 'zba' umwandeln, wenn ich Ihre Anforderung richtig habe, aber zu 'zaaa' erweitert wird. Du versäumst es, deinen "Carry" ganz nach oben zu übertragen, sondern nur in den führenden Char. – tofro

Antwort

1

Während auch den Überblick über String-Länge zu halten, um sicherzustellen, dass Sie ihren zugewiesenen Platz nicht überschreiben, ein Null-Abschlusszeichen zu jedem Ihrer if() und if else Segmenten hinzu:

str[0] = '1'; 
str[1] = 0; 

...

str[i] = 'a'; 
str[i+1] = 0; 

Und so weiter.

Diese abschließende Aussage kann nicht tun, was Sie erwarten, dass es tun sollte.
Ich glaube, was Sie tun möchten, ist den Ausdruck zu erhöhen, um auf das nächste Element des Speichers im Besitz von str zeigen.
Denken Sie daran, dass str eigentlich kein Array ist. Es ist ein Zeiger. Die [...] Notation, die Sie verwenden, ist eine Annehmlichkeit, die in C bereitgestellt wird, um arrayähnliches Referenzieren von Zeigern zu ermöglichen.
So kann der Ausdruck str[i] zum Beispiel auch als *(str + i) ausgedrückt werden. Wenn es den nächsten Speicherplatz ist (wo der nächste char gespeichert ist) Sie wollen, würde der Ausdruck sein: *(str + i++), die, wenn sie Notation zur Verwendung von Array übersetzt: str[i++]

Ändern Sie den von

folgenden
else{ 
     str[i]++; 

zu:

else{ 
     str[i++]=0; 
+1

Dies schien den Trick zusätzlich zum Hinzufügen von NULL terminierenden Anweisungen am Ende jeder if-Anweisung zu tun. Danke euch allen für die Hilfe, ihr seid eine tolle Community. – acorbs

1

Ihr Problem besteht darin, dass Sie Ihre Zeichenfolge im Treiberprogramm nicht NULL-terminieren. Die Ausführung Ihres Codes mit meinem eigenen Treiberprogramm funktioniert einwandfrei, sodass Sie bei zusätzlicher Hilfe Ihr Treiberprogramm mit uns teilen müssen.

Alles, was Sie tun müssen, ist, nachdem Sie die char * mit der Zeichenfolge füllen, machen Sie das nächste Zeichen ein '\0' Zeichen. Da die strlen Funktion einfach über das Array von char s iteriert, bis es ein abschließendes NULL-Zeichen erreicht, müssen Sie alle Zeichenfolgen mit diesem Zeichen beenden, bevor Sie sie verwenden.

+0

Hinweis: In C ist der Großbuchstabe NULL am besten für 'NULL', die Nullzeigerkonstante, reserviert. Hier schlagen Sie _null character_ oder ''\ 0'' vor. – chux

0

es richtig für "ZAZ" funktioniert?