2012-02-09 50 views
5

'\ 0'改行文字から一番右のスペースまで、文字列の最後の単語をどのように取得しますか?たとえば、strに文字列を割り当てることができるこのようなものがあります:C文字列:文字列の最後の単語を取得

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

黄色になるのはどうですか?このような

答えて

9

何か:

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

....ループではなく、単にスペースを探して

if (!isalpha(*cPtr)) 

を言うのは簡単だろう= strrchr(str、 '')+ 1; ' – LihO

+2

@LihO:戻り値が1(見つからないことを意味する)であるかどうかを確認する必要があります。これは勝利ではありません。 –

+0

@LihOありがとう:-)スペースが最後の文字でないことを確認するためにいくつかのチェックを追加しました。 – cnicutar

-2

これを行うための最善の方法は、既存のソリューションを利用することです。そのような解決策の1つ(より一般的な問題)は、Cのオープンソース正規表現ライブラリPerl Compatible Regular Expressionsです。文字列 "my cat is yellow"を正規表現\ b(\ w +)$とマッチさせることができますCで "\ b(\ w +)$")、最初に取得したグループを「黄色」に保ちます。

+0

ルール:regexを使用できない場合は使用しないでください))) – mikithskegg

+1

シンプルなもの(と私は宿題だと思う)にregexを使う必要はありません –

-2

(ひどいため息)元のコードは標準/ K & R/ANSI Cでは間違っています!それは文字列(strという名前の文字配列)を初期化しません!私は、この例がコンパイルされていれば驚くだろう。あなたは、文字列を操作しようとしないで、あなたは、ソースコード内にハードコーディングされた「私の猫は黄色である」という文字列にchar型のポインタを使用することができます約束した場合にどのようなプログラムセグメントが本当に必要なのは、

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

ですか。

"単語"がスペース文字またはNULL文字で囲まれている場合は、文字ポインタを宣言してNULLの直前の文字から後方に歩く方が速いでしょう。もちろん、あなたが最初の非空の文字列があったことを確認する必要があるだろう....

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

今、あなたは、このようなDogs-」として、任意のアルファベット以外の文字が単語の境界をマークすべきであると主張することができ「チェイス・ネコ」または「マイ・ネコ:イエロー」。 `のchar * P:その場合には、` + 1 'は、初期化中に行うことができること

+0

uncompilable code as is;ひどく畳み込まれていて、やり方がコメントされている。 –

+0

コメントは、コードを維持する必要があるプログラマーにとって、Cの新しい人と(本番環境の)人の両方の利益のために含まれています。コメントのサイズは、実行可能ファイルのサイズとは無関係であることを覚えておいてください。 –

+0

コードがコンパイルできないと思っている場合は、何が間違っているかを自由に説明してください。狙撃は良くない。 –

関連する問題