2

私は持っていますchar **s; そしてそれはfuncに送られます:

func(&s);

bool func(char ***p);

ここで、特定の文字列がsに存在するかどうかを調べたいと思います。できます:

while (*s) {
if (strcmp(*s, "MyString") == 0) found;
s++;
}

しかし、これを行うためのショートカットはありますか?関数'func'は、制限され、事前定義された特定の文字列を埋めることができます。

ありがとうラム

4

5 に答える 5

1

関数を見ると、strstr別の文字列で最初に出現する文字列が見つかります。

于 2012-09-03T14:55:12.673 に答える
0

実際には、標準Cライブラリには、文字列を操作するための必要最低限​​の機能しかありません。文字列配列(またはリンクリストのような他の「複雑な」データ構造...)はほとんどサポートされていません。

とはいえ、誰もがそれらを必要としているので、コードにリンクされているライブラリとユーティリティを確認する必要があります。リストをいただければ、指摘できるかもしれません。

于 2012-09-03T14:58:59.387 に答える
0

確かstrstrに、他の文字列で最初に出現する部分文字列を見つけるC標準ライブラリの機能があります。sそれが文字列へのポインタであると仮定しましょう。

if (strstr(*s, "MyString") != NULL) {
    /* found */
} else {
    /* not found */
}

が文字列の配列である場合sは、配列を実行し、現在の文字列とサブ文字列を。と比較する必要がありますstrstr

#include <stddef.h>
#include <string.h>

int
f(char const **p, char const *q, size_t nmemb)
{
    for (size_t i = 0; i < nmemb; ++i)
        if (strstr(p[i], q) != NULL)
            return 1;
    return 0;
}

すべての文字列のサイズが同じである場合は、実際にを使用できますstrcmp

#include <stddef.h>
#include <string.h>

int
f(char const **p, char const *q, size_t nmemb, size_t size)
{
    for (size_t i = 0; i < nmemb; ++i)
       if (strncmp(p[i], q, size) == 0)
            return 1;
    return 0;
}

もう1つの解決策は、配列を並べ替えてから、要素を検索することです。

#include <stddef.h>
#include <stdlib.h>

static int
cmp(void const *p, void const *q)
{
    return strcmp((char const *)p, (char const *)q);
}

int
search(char const **p, char const *q, size_t nmemb, size_t size)
{
    return bsearch(q, p, nmemb, size, cmp);
}

void
sort(char const **p, size_t nmemb, size_t size)
{
    qsort(p, nmemb, size, cmp);
}
于 2012-09-03T15:00:59.563 に答える
0

いいえ、C標準ライブラリの文字列の配列から文字列を検索する関数はありません。

文字列の配列(より正確には配列のchar配列)があるため、各項目をループして、一致するかどうかを確認する必要があります。strcmpまたはを使用できますstrstrが、それは実際には問題ではありません。

于 2012-09-03T15:04:36.917 に答える
0

whileループを次のように変更するだけです。

while (**s) 
{
if (strcmp(**s, "MyString") == 0) found;
s++;
}
于 2012-09-03T15:47:31.967 に答える