(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 ....
że '+ 1 'można zrobić w ciągu inicjalizacji:' char * p = strrchr (str, '') + 1; ' – LihO
@LihO: Zostaniesz wtedy pozostawiony do sprawdzenia, czy zwrócona wartość wynosi 1 (nie oznacza znalezienia). To nie jest wygrana. –
@LihO Dzięki :-) Dodałem kilka sprawdzeń, aby upewnić się, że spacja nie jest ostatnią postacią. – cnicutar