2009-05-09 9 views
2

2つの文字列を指定すると、文字列Aが文字列Bの部分文字列であれば、文字列Aと一致する文字列Bの位置を返す関数を作成します。それ以外の場合は-1を返します。 例:サブストリング抽出エクササイズ

strA = "ello" 
strB = "Hello_World" 
Your function should return 1. 

strA = "blah" 
strB = "blha" 
Your function should return -1. 
+1

天才の質問のみが受け入れられます。 なぜ誰もが初心者でとても失礼ですか? – backslash17

+1

他の人にあなたの宿題をさせないでください。あなたが自分でそれをしないと、あなたが学ばなければならないことをあなたは学ばないでしょう。 – lothar

+1

これはHomeworkOverflowではないためです。あなたは天才である必要はありませんが、宿題を騙そうとしていてはいけません。自分で問題を解決するために何か努力してください。 – Yuliy

答えて

2

ブルートフォースバージョン:

int strpos(char* a, char* b) { 
    int n1, n2, i, j; 
    n1 = strlen(a); 
    n2 = strlen(b); 
    for (i = 0; i < n1-n2; i++) { 
    for (j = 0; j < n2; j++) { 
     if (a[i+j] != b[j]) break; 
     else if (j+1 == n2) return i; 
    } 
    } 
    return -1; 
} 

より効果的なアルゴリズムは:Wikipedia: String searching

+2

とにかくstring.hを使うつもりなら(そうでなくても実際には)、どうして冗長でしょうか?また、事前にstrlenを実行することで、ループから抜け出すことによる利益の大部分を失います。 –

+0

これを行う方法を示すだけです。 –

+0

はい、しかし、私が言ったように、それは他のものの中でstrlenのために、素朴な実装です。 –

3

この宿題はありますか?とにかく、string.h documentationを見ると、何のトラブルもなく必要なものを見つけることができます。関数の1つに非常に薄いラッパーを書く必要があります。もちろん、あなたは自分でそれを書くことができます。

編集:まあ、誰かが答えを出したので、私の試みです。

#include <string.h> 

ssize_t str_index(const char *strA, const char *strB) 
{ 
    const char *result; 
    return (result = strstr(strB, strA)) ? (result - strB) : -1; 
} 

だけトリック

は、パラメータの順序が逆ではstrstrからされていることです、あなたは代わりのchar *のssize_tのを返していて、失敗コードは、このように-1です。

+0

strstr()が病的な災害になる可能性がある場合、 "いい"実装をすると信じていると言いたいだけです。 – Tom

+0

そのsize_tは符号なしです。 ssize_tを使用する必要があります。 – Tom

+0

ssize_tの良いキャッチ不思議なことに、警告レベルがgccで(もしあれば)何を知っているのか誰にもわかりますか? -Wall -Wextraはありません。 はい、私は意図的にstrstrを信用しています。理由はないからです。 –

0

これはほぼ正確に宿題の問題のように聞こえます。宿題問題ではないという奇妙なケースでは、Cライブラリ関数strstrは、別の文字列の最初の文字列へのポインタを返します(存在しない場合はnull)。そこから、ポインタ算術を使用して索引を決定することは自明である。

2
#include <string.h> 

int search(char* a, char* b) { 
    char* pos; 
    pos = strstr(b, a); 
    if(pos == 0) return -1; 
    return (int)(pos-b); 
} 
0

strstrについての学習の試み。その文字列で利用可能です。 NEVER標準ライブラリですでに利用可能なものをコーディングする理由があります。 もちろん、宿題に関する質問はありません:)

+0

いつも宿題ではありません。人々が機能をより良い方法で実現できるように、機能を実装しようとします。 –

+0

@fahad:十分に公正ですが、OPが彼の質問に宿題のような匂いを抱かせる方法 –

関連する問題