2016-11-04 14 views
1

this質問がありましたが、私が探していた答えはまったく見つかりませんでした。私はstrstrを試しましたが、整数インデックスの代わりにポインタを返します。部分文字列が存在するかどうかを確認してください

ストリングbが文字列aに含まれているかどうかを調べる必要があります。その場合は、そのインデックスの位置に、strcmpによって返されたインデックスのようなものがあります。 Cでこれを行うための関数や簡単な方法はありますか?

たとえば、aが "foobar"でbが "bar"の場合、 "bar"は "foobar"のインデックス3にあるため、この関数/メソッドは3を返します。

ご協力いただきましてありがとうございます。

+0

'strstr'ないだけで - あなたはそれは、あなたがここにあなたのコードを投稿し、あなたは'の行動に持っている問題を説明しなければならないことを期待するとして、それは動作しない場合そこにstrstr'があります。 – DUman

+3

'' bar "'は '' foobar ''ではインデックス' 3'にあり、 '2'ではありません。 – mch

答えて

4

これにはstrstrとポインタ演算を使用できます。ここ

char *result = strstr(a, b); 
if (result != NULL) { 
    printf("index = %tu\n", result - a); 
} 

result点前方aのバイトの特定数。だから、あなたが2つを引くなら、それはあなたの指数です。ここで

+1

正しい。 MicrosoftのCライブラリやその他のライブラリは、 '%lu '変換指定子をサポートしていない可能性があることに注意してください。そのようなシステムでは、 'printf(" index =%llu \ n "、(unsigned long long)result-a);' – chqrlie

1

あなたは簡単に文字列、aの先頭にポインタを減算することによってインデックスに返されたポインタを変換することができます:

char *p = strstr(a, b); 
int i = p ? p - a : -1; 

(また、strcmpはインデックスを返しません。)

+0

'strcmp'は第1引数と第2引数が異なる最初の点を返しませんか? –

+0

@MDXF http://man7.org/linux/man-pages/man3/strcmp.3.html#RETURN_VALUE – melpomene

+1

@MD XF - そうではありません。 'strcmp()'は差異の性質を検出するだけです(辞書的には、辞書的にはより小さい、等しい、または大きい)。違いがどこにあるかについての情報は返されません。 – Peter

0

あなたが行く:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str1[]="foobar"; 
    char str2[]="bar"; 
    char *ptr; 
    if((ptr = strstr(str1, str2)) != NULL) { 
     printf("Start offset: %td\n", ptr - str1); 
    } 

    return 0; 
} 
+0

を使ってUBからあなたを救うことはできません。 – melpomene

+0

私の理解はptrdiff_tは、printfの%dが期待する符号付きintです。本当? –

+0

いいえ: 'ptrdiff_t'は' int'以上になることができる符号付きの型です。 Linuxの64ビットでは、それは '長い'であり、Windowsの64ビットでは、 'long long'です。 'printf("開始オフセット:%td \ n "、ptr-str1);'または 'printf("開始オフセット:%lld \ n "、(long long)(ptr-str1));' – chqrlie

関連する問題