C - Teilstring extrahieren..

Leitwolf22

Lt. Junior Grade
Registriert
Juni 2008
Beiträge
269
Sorry, mir ist das etwas peinlich. Die Aufgabe sollte wirklich einfach sein, aber ich steck fest und komm nicht weiter. Und wenn man schon mal die Seuche hat, dann findet man auch im Netz nichts mehr, bzw. ist halt blind..

Ich möchte einfach den Teil eines Strings extrahieren, und zwar anhand einer fixen Position. Also sagen wir die Stellen 4-6 in diesem Beispiel:

char str1[] = "abcdefghijklmnopqrstuvwxyz";
char *teil = str1 + 3;

printf ("%s\n", str1 + 3);
printf ("%s\n", teil);

Ich möchte also das Ergebnis "def" erhalten, weiß aber nicht wie. Die ersten drei Zeichen überspringen geht ja problemlos, nur wie kürze ich den String dann auf eben die nächsten drei Zeichen? Meine Idee wäre gewesen einfach einen kürzeres Array auf die entsprechende Stelle zeigen zu lassen, was aber zu einem Fehler führt. Also..

char *teil[3] = str1 + 3;

Das sollte doch irgendwie möglich sein, ohne jetzt umständliche String Funktionen zu bemühen, also etwa die Gesamtlänge des String zu bestimmen und dann von hinten her abschneiden usw. Weiß jemand wie?

lg.
 
z.B. in einer Schleife ab Stelle 3 die nächsten 2 (6-4) Zeichen rauskopieren.
Oder bei Stelle 7 den Buchstaben in eine Variable sichern, einen \x00 an die Stelle schreiben, dern String ab 3 (dein *teil) ausgeben und danach die gesicherte Variable wieder an Stelle 7 schreiben.

Die "richtige" Variante hat bog schon benannt.
 
Ok, danke! So geht's natürlich. Dennoch irritiert mich, dass es nicht ohne "Umwege" möglich sein soll. Aber ja, dann muss ich mir das wohl aus dem Kopf schlagen ;)
 
1 #include <stdio.h>
2
3 int main(void){
4 char str[] = "123456789";
5 printf("%.*s", 3, str+3);
6 return 0;
7 }
 
Shit, ich komm noch immer keinen Millimeter voran. Wie bekomme ich nun teil1 durch die strncpy() Funktion? Weil das hier liefert ja auch einen Fehler..

char str1[] = "abcdefghijklmnopqrstuvwxyz";
char *teil1 = str1 + 3;
char teil2;

strncpy (teil2, teil1, 3);

Und andererseits kann ich mit strncpy() nicht die vorderen Zeichen abschneiden.
 
teil2 sollte initialisiert sein: char teil2[10];
und teil2[3] = '\0'; fehlt auch.
 
Die Funtionen der C standard library sind die Abkürzung.

char str1[] = "abcdefabc";
char str[4];
str[0] = str1[3];
str[1] = str1[4];
str[2] = str1[5];
str[3] = 0;
 
@aroxx perfekt! Was genau tust du da und wie kann ich dieses Ergebnis einem Array zuweisen?

printf("%.*s", 3, str+3);

Hab ich noch nie gesehen, ich versteh da nur Bahnhof. Was bedeutet "%."? Das bezieht sich offenbar auf die "3", die die Zahl der Zeichen angibt. *s dereferenziert den string, und str + 3 rückt die Position vor...
 
Leitwolf22 schrieb:
Shit, ich komm noch immer keinen Millimeter voran. Wie bekomme ich nun teil1 durch die strncpy() Funktion? Weil das hier liefert ja auch einen Fehler..

char str1[] = "abcdefghijklmnopqrstuvwxyz";
char *teil1 = str1 + 3;
char teil2;

strncpy (teil2, teil1, 3);

Und andererseits kann ich mit strncpy() nicht die vorderen Zeichen abschneiden.

"char teil2" hat nur platz für ein char du willst da aber 3 hinschreiben richtig ist also wenn du es so macht

char source[] = "1234"; // ist eine zeichenkette mit 5 plaetzen laenge des String + eine 0 mit string funktionen wissen wann dieser string zu ende ist die arbeiten sonst weiter bis da zufaellig eine 0 ist
char destination[3] // hat platz fuer 2 zeichen und die Terminierung.
char istkeinstring; // hat platz fuer ein zeichen ohne 0 also nicht benutzen fuer str funktionen

hier ein bsp
char src[] = "1234";
char dst[3];

die eins wollen wir ueberspringne deswegen nehmen wir einen extra ptr
char* ptr = src+1;
strncpy(ptr,dst,2); //das letzte byte in dst wird von strncpy nullterminiert
 
multivac Ja danke, das ist ganz richtig und Sam hat schon darauf hingewiesen. Wenn ich teil2 initialisiere, dann funktioniert es schließlich auch.

Dennoch fasziniert mich der direkte Ansatz von aroxx. Funktioniert das nur mit printf, oder kann ich so auch direkt ein string array befüllen?
 
Ich denke es ist ein Trick und bedingt durch das printf. Daher solltest Du es auf dem Standardweg lösen, mit dem Du bereits begonnen hast.
 
also eigentlich ist das kein "trick".

printf("%.*s", 3, str+3);

%.*s ist wie in der doku beschrieben:
A format specifier following this prototype:
%[flags][width][.precision][length]specifier

wobei:
[flags] und [width] nicht verwendet werden
[precision] = .* (-> Doku: The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.)
[lenght] wird auch nicht verwendet
specifier ist s für "String of characters"

edit: Multivacs Antwort beantwortet im Übrigen die Frage: "Funktioniert das nur mit printf, oder kann ich so auch direkt ein string array befüllen?"
 
Zuletzt bearbeitet:
Zurück
Oben