2009-12-07 26 views
5

ho la stringa: "[email protected]"estrazione sottostringhe in C

Sto cercando di scrivere un programma C che saranno più tutti e tre sottostringhe ("foo", "bar" e "baz") e mettere ciascuno in essa la propria stringa.

P.S. Non preoccuparti, questo è non compiti.

+0

A proposito, questo sembra un dup. – monksy

+0

Hai fatto qualche progresso? Probabilmente otterrai più risposte se fai una domanda più specifica. In questo momento stai chiedendo a qualcuno di scrivere l'intero programma per te nella casella di risposta. – benzado

risposta

10

Quello che stai cercando è strtok. Ti permette anche di impostare i delimitatori.

+4

Fintanto che la stringa che viene tokenizzata è modificabile. Non fare 'strtok (" foo $ bar @ baz "," $ ");' –

+1

Perché il punteggio 7 dove ci sono 9 upvotes e 1 downvote. Immagino che a qualcuno non piaccia strtok .. strano. – monksy

1

se non è per :-) compiti di strtok non è consigliato, se non è possibile utilizzare C++ (perché?) Si dovrebbe usare strtok_r (versione reentrent)

0

Strtok mantiene un buffer statico quando creazione di token che viene sovrascritto quando viene chiamato altrove con una nuova stringa non NULL, che potrebbe interrompere la funzionalità che stai cercando. per esempio. chiamate intrecciate con stringhe diverse.

Invece, è possibile utilizzare strsep, che è come strtok, ma si mantiene il buffer temporaneo da soli, nel caso in cui sia necessario tokenize più stringhe, ad es. con le chiamate intrecciate con stringhe diverse.

In casi di piccole dimensioni, questo problema probabilmente non si presenterà, ma è possibile in progetti più grandi.

MODIFICA: questo non è standard, quindi assicuratevi di avere questa funzione prima di provare ad usarlo. So per certo che è disponibile su BSD, e, eventualmente, altri Unix

EDIT: strsep e strtok_r sembrano avere la stessa funzionalità

1

Poiché questo è diritta C, potrebbe essere divertente per rivedere come le stringhe sono memorizzate e terminato. Dal momento che si dispone di un carattere di terminazione per ogni sezione, si può solo farne un vero terminatore ('\ 0') e lasciare le stringhe in atto:

#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); 

} 

Io non farei questo nel codice di produzione, in questo giorno ed età. Ma molto indietro quando, facendo un passaggio sul loop e una copia per lo storage, sarebbe stata considerata una grande vittoria.

+0

Dann, 2 passaggi se si conta la strcpy. Un ciclo di copia e impostazione viene lasciato come esercizio per il lettore. –

+0

di quanto non facciano prima una copia :) – warren