Strings teilen
-
Jackie007 schrieb:
Danke an alle!
2. nach dem beenden der while schleife weißt wo der string zu trennen ist und fuegen an der
trennstelle ein \0 ein.
Aber ich kanns net genau übersetzen.Eben nicht, wenn du meinen Post gelesen hättest dann würdest du wissen dass du
dann einen Buchstaben überschreibst.Als korrekte Lösung würde ich (gegen deinen Wunsch es selber zu machen) diese
hier vorschlagen:void share(char a[], char b[]){ int i; // Laufvariable int posDB=0; // posDB = Position des Doppelbuchstabens posDB=GetPosDBfromString(a); if(posDB>0){ for(i=posDB; a[i]!='\0'; i++) b[i-posDB]=a[i]; b[i-posDB]='\0'; a[posDB]='\0'; } } int GetPosDBfromString(char a[]){ int i; // Laufvariable for(i=0; a[i]!='\0'; i++) if(a[i]==a[i+1]) return i+1; return 0; }getestet mit Visual Studio 2010 Ultimate.
Gruß
ITEDVO
-
Die Lösung von itedvo hat den Nachteil, das zwei Funktionen benötigt werden.
Habe als Basis die Lösung von Wutz genommen, Der Teufel steck allerdings im Detail ..
Mit "Bett" funktionierts und mit mehr als 2 gleichen Buchstaben auch.
Hier die (getestete) VS2010 Version.
#include "stdafx.h" #include "string.h" #define MAX_LEN 100 //Beispiel: //String A: Wetter -> Das "ter" dann in nen neuen String rein --> String A: "Wet" und String B: "ter" void share(char a[], char b[]) { int x, i=0; for(x=0; a[x] != '\0'; x++) { if(a[x] == a[x+1]) { // wenn gleich, b[0] = a[x+1]; // vorher kopieren a[x+1] = (char)0; // dann trennen x+=2; for(i=1 ; a[x] != 0; i++, x++ ) b[i] = a[x]; x--; // letztes zurück } } b[i] = (char)0; // b terminieren } int _tmain(int argc, _TCHAR* argv[]) { char a[MAX_LEN]; // Original-String char b[MAX_LEN]; // Rest-String soll dann die 2. Hälfte des Wortes stehn, wenn ein Doppebuchstaben vorhanden is. Im oberen Bespiel: "ter" strcpy(a, (char *)"Bett"); // hier später Benutzereingabe share(a, b); printf((char *)" a: %s\n b: %s\n", a, b); return 0; } /* Ergebnis: a: Wet b: ter */
-
itedvo schrieb:
int GetPosDBfromString(char a[]){
int i; // Laufvariable
for(i=0; a[i]!='\0'; i++)
if(a[i]==a[i+1])
return i+1;return 0;
}
[/cpp]Dabei kann über das letzte Arrayelement hinaus gelesen werden.
-
merano schrieb:
Die Lösung von itedvo hat den Nachteil, das zwei Funktionen benötigt werden.
Nachteil?
Oh Junge...
-
itedvo schrieb:
getestet mit Visual Studio 2010 Ultimate.
Mein Visualstudio hat das bemängelt:
error C3861: "GetPosDBfromString": Bezeichner wurde nicht gefunden.Da wäre eine Forwarddeklaration notwendig, oder andere Reihenfolge.
Immerhin ist das Ergebnis (fast) richtig:
Die bange Frage was passiert, wenn kein Buchstabe doppelt ist?
Der String b ist dann leider undefiniert, oder hat den Wert vom letzen mal ..
-
Also, es ist klar dass diese beiden Funktionen vor der main-funktion gehören,
ansonsten fehlt natürlicherweise ein Prototyp, welchen ich natürlicherweise
nicht angegeben habe, da man so eine kleinigkeit mit sicherheit verlangen kann
(Wie auch die richtige Reihenfolge der Deklaration)!Weiteres habe ich eine 2. Funktion verwendet nicht weil es nicht anders ging,
sondern der Übersichtshalber.@Bugdetector:
Eine for-Schleife wird so abgearbeitet:folglich kann nicht über das letzte Arrayelement hinübergelesen werden!
[EDIT]:
@merano:
Was soll schon damit sein? Grundlegend ist es doch so: Funktionen erfüllen den im Namen genannten Zweck, ob jetzt aber string b leer bleibt oder nicht wird
nicht in der Funktion bearbeitet. Sprich würd ich sagen dies sollte anderswertig geschehen so zum Beispiel bei der Deklaration des Strings b mit einer
gleich darauf folgender Initialisierung!char b[MAX_S_LENG]={0};@Bugdetector:
Wenn jedoch das Wort nur 1 Buchstabe enthält ist es dennoch 2 Elemente groß.
Folglich wird es wiederum nicht überschritten (da 2. Element == '\0')Wenn der String leer ist, sprich undefinierter Inhalt enthalten ist und man
dies berücksichtigt müsste man natürlicherweise die for-schleife so umbauen:for(i=0; a[i]!='\0' && i < MAX_S_LENG; i++)
-
Jop, ich danke euch.
Ich hab mir die ganze Beiträge durchgelesen etc. und dann selber probiert^^.
Es funktioniert, ja.
Aber das Problem ist, wenn ich nur "Montag" eingebe, dann ist String a: Montag und String b:Lauter Zeichen-Character.
Und ein Stack-Arround kommt auch noch.
Meine Lösung wäre dieses Unterprogramm(oder Funktion)"share" nur auszuführen, wenn ein Doppelbuchstabe vorkommt und wenn nicht dann soll es nicht ausgeführt werden.
//Aufgabe: Schreiben Sie ein Programm das die Wörter trennt, wenn Doppelbuchstaben vorkommen. // //Beispiel: //String A: Wetter -> Das "ter" dann in nen neuen String rein --> String A: "Wet" und String B: "ter" #include <stdio.h> #define MAX_LEN 100 void share(char a[], char b[]); void share(char a[], char b[]) { int i=0; int x=0; while(a[x] != a[x+1] && a[x] != '\0') { x++; } b[i]=a[x+1]; i++; a[x+1]='\0'; x++; x++; while(a[x] != '\0') { b[i]=a[x]; i++; x++; } b[i]='\0'; } int main() { char a[MAX_LEN]; // Gesamter String char b[MAX_LEN];//In diesem String soll dann die 2. Haelfte des Wortes stehn, wenn ein Doppebuchstaben vorhanden ist. Im oberen Bespiel: "ter" int x=0; printf("Eingabe(1 Wort):\n"); gets(a); share(a,b); printf("1. Haelfte: %s\n",a); printf("2. Haelfte: %s\n",b); return(0); }
-
Wie behandelst du denn den Fall, wenn kein Doppelzeichen vorkommt?
void share(char a[], char b[]) { int i=0; int x=0; while(a[x] != a[x+1] && a[x] != '\0') { x++; } // Dann ist hier a[x] == '\0' b[i]=a[x+1]; i++; a[x+1]='\0'; x++; x++; while(a[x] != '\0') // Da x schon weiter ist, kannst du lange auf a[x] == '\0' warten! { b[i]=a[x]; i++; x++; } b[i]='\0'; // Das musst du auf alle Fälle machen. }Also darfst du nur weitermachen, wenn nach deiner ersten while-Schleif
ist.
-
Stimmt, danke!
Aber ich hab jetzt eine andere Frage.
Ein \0 ist ja das Ende eines Strings wenn jetzt a[x]='\0' was ist dann a[x+1]?
Das sind bei mir beim debuggen solche komischen Zeichen. Was ist das?
Ich dachte der String hört nach dem \0 auf?
-
Dahinter befindet sich das Land des undefinierten

-
Jackie007 schrieb:
Ich dachte der String hört nach dem \0 auf?
Der String schon.
Aber dein Array nicht.
Das hatMAX_LENElemente.
Und Irgendetwas steht da halt drin.