2012-02-09 73 views
5

làm cách nào bạn nhận được từ cuối cùng của chuỗi, bắt đầu từ ký tự dòng mới '\ 0' đến không gian ngoài cùng bên phải? Ví dụ, tôi có thể có một cái gì đó như thế này, nơi str có thể được chỉ định một chuỗi:di chuyển chuỗi C: nhận từ cuối cùng của chuỗi

char str[80]; 
str = "my cat is yellow"; 

Làm thế nào tôi sẽ có màu vàng?

Trả lời

9

Something như thế này:

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

Đó '+ 1' có thể được thực hiện trong vòng khởi:' char * p = strrchr (str, '') + 1; ' – LihO

+2

@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. –

+0

@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

-2

Cách tốt nhất để làm điều này là để tận dụng lợi thế của các giải pháp hiện có. Một giải pháp như vậy (với một vấn đề chung hơn) là Perl Compatible Regular Expressions, một thư viện biểu thức chính quy mã nguồn mở cho C. Vì vậy, bạn có thể khớp chuỗi "con mèo của tôi có màu vàng" với biểu thức chính quy \ b (\ w +) $ (được biểu thị trong C dưới dạng "\ b (\ w +) $") và giữ nhóm được chụp đầu tiên, là "màu vàng".

+0

Một quy tắc: nếu bạn không thể sử dụng regex, không sử dụng chúng))) – mikithskegg

+1

không cần phải sử dụng regex cho một cái gì đó đơn giản (và tôi nghĩ rằng đó là bài tập về nhà) –

-2

(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 ....

+0

mã uncompilable như; terribly phức tạp và cách thức hơn bình luận. –

+0

Các ý kiến ​​được đưa vào vì lợi ích của cả người mới đến C và (trong môi trường sản xuất) đối với các lập trình viên phải duy trì mã. Hãy nhớ rằng, kích thước của các bình luận không bằng với kích thước của tập tin thực thi. –

+0

Nếu bạn cho rằng mã không thể giải mã được, bạn sẽ cảm thấy tự do để giải thích những gì sai. Sniping không tốt. –

Các vấn đề liên quan