2012-02-09 15 views

Odpowiedz

9

coś takiego:

char *p = strrchr(str, ' '); 
if (p && *(p + 1)) 
    printf("%s\n", p + 1); 
+0

że '+ 1 'można zrobić w ciągu inicjalizacji:' char * p = strrchr (str, '') + 1; ' – LihO

+2

@LihO: Zostaniesz wtedy pozostawiony do sprawdzenia, czy zwrócona wartość wynosi 1 (nie oznacza znalezienia). To nie jest wygrana. –

+0

@LihO Dzięki :-) Dodałem kilka sprawdzeń, aby upewnić się, że spacja nie jest ostatnią postacią. – cnicutar

-2

Najlepszym sposobem, aby to zrobić, aby skorzystać z istniejących rozwiązań. Jednym z takich rozwiązań (o wiele bardziej ogólnym problemem) jest Perl Compatible Regular Expressions, biblioteka regularnych wyrażeń regularnych dla C. Możesz więc dopasować ciąg "mój kot jest żółty" z wyrażeniem regularnym \ b (\ w +) $ (wyrażone w C jako "\ b (\ w +) $") i zachowaj pierwszą przechwyconą grupę, która jest "żółta".

+0

Reguła: jeśli nie możesz używać wyrażenia regularnego, nie używaj ich))) – mikithskegg

+1

nie trzeba używać wyrażenia regularnego dla czegoś, co jest proste (i myślę, że to praca domowa). –

-2

(ciężkie westchnienie) Oryginalny kod jest WRONG w standardzie/K & R/ANSI C! NIE inicjalizuje łańcucha znaków (tablica znaków o nazwie str)! Byłbym zaskoczony, gdyby przykład został skompilowany. Co Twój odcinek programu naprawdę potrzebuje

if strcpy(str, "my cat is yellow") 
    { 
    /* everything went well, or at least one or more characters were copied. */ 
    } 

albo, jeśli obiecał nie próbować manipulować ciąg, można użyć wskaźnika char do „mój kot jest żółty” string zakodowanej w kodzie źródłowym.

Jeśli, jak stwierdzono, "słowo" jest ograniczone znakiem spacji lub znakiem NULL, wówczas szybciej byłoby zadeklarować wskaźnik postaci i przejść wstecz od znaku tuż przed NULL. Oczywiście, to najpierw trzeba mieć pewność, że istnieje niepusty ciąg ....

#define NO_SPACE 20 
#define ZERO_LENGTH -1 

int iLen; 
char *cPtr; 

if (iLen=strlen(str)) /* get the number of characters in the sting */ 
    { /* there is at least one character in the string */ 
    cPtr = (char *)(str + iLen); /* point to the NULL ending the string */ 
    cPtr--; /* back up one character */ 
    while (cPtr != str) 
     { /* make sure there IS a space in the string 
      and that we don't walk too far back! */ 
     if (' ' == *cPtr) 
      { /* found a space */ 
/* Notice that we put the constant on the left? 
    That's insurance; the compiler would complain if we'd typed = instead of == 
*/ 
      break; 
      } 
     cPtr--; /* walk back toward the beginning of the string */ 
     } 
    if (cPtr != str) 
     { /* found a space */ 
     /* display the word and exit with the success code */ 
     printf("The word is '%s'.\n", cPtr + 1); 
     exit (0); 
     } 
    else 
     { /* oops. no space found in the string */ 
     /* complain and exit with an error code */ 
     fprintf(STDERR, "No space found.\n"); 
     exit (NO_SPACE); 
     } 
    } 
else 
    { /* zero-length string. complain and exit with an error code. */ 
    fprintf(STDERR, "Empty string.\n"); 
    exit (ZERO_LENGTH); 
    } 

Teraz można argumentować, że każdy zakaz alfabetu należy oznaczyć granicę słowa, takie jak „Dogs- pogoń za kotami "lub" mój kot: żółty ". W tym przypadku byłoby to łatwo powiedzieć

if (!isalpha(*cPtr)) 

w pętli zamiast patrzenia tylko na przestrzeni ....

+0

nieskompilowany kod jak jest; potwornie zawiłe i na swój sposób skomentowane. –

+0

Komentarze są dołączane z korzyścią dla obu osób, które nie są w C i (w środowisku produkcyjnym) dla programistów, którzy muszą zachować kod. Pamiętaj, że rozmiar komentarzy ma zero do wielkości pliku wykonywalnego. –

+0

Jeśli uważasz, że kod jest nieskompilowany, powinieneś swobodnie wyjaśniać, co jest nie tak. Snajpe nie robi nic dobrego. –

Powiązane problemy