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.
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.
ブルートフォースバージョン:
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
とにかくstring.hを使うつもりなら(そうでなくても実際には)、どうして冗長でしょうか?また、事前にstrlenを実行することで、ループから抜け出すことによる利益の大部分を失います。 –
これを行う方法を示すだけです。 –
はい、しかし、私が言ったように、それは他のものの中でstrlenのために、素朴な実装です。 –
この宿題はありますか?とにかく、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です。これはほぼ正確に宿題の問題のように聞こえます。宿題問題ではないという奇妙なケースでは、Cライブラリ関数strstrは、別の文字列の最初の文字列へのポインタを返します(存在しない場合はnull)。そこから、ポインタ算術を使用して索引を決定することは自明である。
#include <string.h>
int search(char* a, char* b) {
char* pos;
pos = strstr(b, a);
if(pos == 0) return -1;
return (int)(pos-b);
}
strstrについての学習の試み。その文字列で利用可能です。 NEVER標準ライブラリですでに利用可能なものをコーディングする理由があります。 もちろん、宿題に関する質問はありません:)
いつも宿題ではありません。人々が機能をより良い方法で実現できるように、機能を実装しようとします。 –
@fahad:十分に公正ですが、OPが彼の質問に宿題のような匂いを抱かせる方法 –
天才の質問のみが受け入れられます。 なぜ誰もが初心者でとても失礼ですか? – backslash17
他の人にあなたの宿題をさせないでください。あなたが自分でそれをしないと、あなたが学ばなければならないことをあなたは学ばないでしょう。 – lothar
これはHomeworkOverflowではないためです。あなたは天才である必要はありませんが、宿題を騙そうとしていてはいけません。自分で問題を解決するために何か努力してください。 – Yuliy