(tiếng thở dài nặng) Mã gốc là WRONG theo tiêu chuẩn/K & R/ANSI C! Nó không khởi tạo chuỗi (mảng ký tự có tên str)! Tôi sẽ ngạc nhiên nếu ví dụ được biên dịch. Phân khúc chương trình của bạn thực sự cần là
if strcpy(str, "my cat is yellow")
{
/* everything went well, or at least one or more characters were copied. */
}
hoặc, nếu bạn hứa sẽ không cố gắng lôi kéo chuỗi, bạn có thể sử dụng một con trỏ char với "con mèo của tôi là vàng" chuỗi mã hóa cứng trong mã nguồn của bạn.
Nếu, như đã nêu, "từ" bị giới hạn bởi ký tự khoảng trắng hoặc ký tự NULL, thì sẽ nhanh hơn để khai báo một con trỏ ký tự và đi ngược về phía trước ký tự ngay trước NULL. Rõ ràng, đầu tiên bạn phải chắc chắn rằng đã có một chuỗi không có sản phẩm nào ....
#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);
}
Bây giờ bạn có thể tranh luận rằng bất kỳ ký tự không thuộc chữ cái nên đánh dấu một ranh giới từ, chẳng hạn như "Dogs- mèo săn đuổi "hoặc" mèo của tôi: màu vàng ". Trong trường hợp đó, nó muốn được dễ dàng để nói
if (!isalpha(*cPtr))
trong vòng lặp thay vì tìm kiếm chỉ là một không gian ....
Nguồn
2012-02-10 06:15:19
Đó '+ 1' có thể được thực hiện trong vòng khởi:' char * p = strrchr (str, '') + 1; ' – LihO
@LihO: Sau đó, bạn sẽ được trái để kiểm tra xem giá trị trả về là 1 (có nghĩa là không tìm thấy). Đây không phải là một chiến thắng. –
@LihO Cảm ơn :-) Tôi đã thêm một số kiểm tra để đảm bảo không gian không phải là ký tự cuối cùng. – cnicutar