2009-12-07 7 views
5

Ich habe die Zeichenfolge: "[email protected]"Extrahieren von Teil in C

Ich suche ein C-Programm zu schreiben, das werden zusätzlich alle drei Teile ("foo", "bar" und "baz") und jeder legen in seinen eigenen String.

P.S. Mach dir keine Sorgen, das ist nicht Hausaufgaben.

+0

Btw, das sieht aus wie ein dup. – monksy

+0

Haben Sie Fortschritte gemacht? Sie werden wahrscheinlich mehr Antworten erhalten, wenn Sie eine spezifischere Frage stellen. Im Moment bitten Sie jemanden, das gesamte Programm für Sie in die Antwortbox zu schreiben. – benzado

Antwort

10

Was Sie suchen, ist strtok. Es ermöglicht Ihnen, auch die Begrenzer zu setzen.

+4

Solange die zu Tokenisierende Zeichenfolge änderbar ist. Tun Sie nicht 'strtok (" foo $ bar @ baz "," $ ");' –

+1

Warum ist das Ergebnis 7, wo es 9 upvotes und 1 downvote gibt. Ich denke, jemand mag strtok nicht .. komisch. – monksy

1

, wenn es nicht für die Hausaufgaben :-) als strtok ist nicht zu empfehlen, wenn Sie nicht C++ verwenden können (warum?) Sie strtok_r (reentrent Version)

0

Strtok hält einen statischen Puffer verwendet werden soll, wenn die Zeichenüber Wird überschrieben, wenn wenn anderswo mit einer neuen non-NULL-Zeichenfolge aufgerufen wird, die die Funktionalität, die Sie suchen, unterbrechen könnte. z.B. verflochtene Anrufe mit unterschiedlichen Strings.

Stattdessen können Sie strspe verwenden, das wie strtok ist, aber Sie behalten den temporären Puffer selbst, falls Sie mehrere Zeichenfolgen, z. mit den verflochtenen Rufe mit verschiedenen Streichern.

In kleinen Fällen wird dieses Problem wahrscheinlich nicht auftreten, aber es kann in größeren Projekten auftreten.

EDIT: Dies ist nicht Standard c, also stellen Sie sicher, dass Sie diese Funktion haben, bevor Sie versuchen, es zu verwenden. Ich weiß sicher, dass es auf BSD verfügbar ist, und möglicherweise auch andere Unix der

EDIT: strsep und strtok_r erscheinen die gleiche Funktionalität

1

haben Da diese gerade C ist, könnte es Spaß zu überdenken, wie Strings gespeichert werden und beendet. Da Sie für jeden Abschnitt ein abschließendes Zeichen haben, können Sie es einfach in einen wahren Terminator machen (‚\ 0‘) und die Saiten an Ort und Stelle lassen:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv) { 

char *s1,*s2,*s3, *test = "[email protected]"; 
char *buf=(char *)malloc(100); 
char *p,c; 

strcpy(buf, test); 

s1 = p = buf; 
while(c = *p) { 
    if (c == '$') { *p = '\0'; s2 = p+1; } 
    if (c == '@') { *p = '\0'; s3 = p+1; } 
    p++; 
} 

printf("s1 = %s\n",s1); 
printf("s2 = %s\n",s2); 
printf("s3 = %s\n",s3); 

} 

würde ich dies nicht in der Produktion Code tun, in dieser Tag und dieses Alter. Aber damals, als man einen Durchlauf auf der Schleife und eine Kopie für den Speicher gemacht hätte, wäre das ein großer Gewinn gewesen.

+0

Darn, 2 Pässe, wenn Sie den Strcpy zählen. Eine Copy-and-Set-Schleife wird dem Leser als Übung überlassen. –

+0

als keine Kopie zuerst :) – warren