4

一連のスレッドを調べた後、C および C++ で正規表現を使用するには regex.h を使用する必要があることがわかりました。

しかし、文字列内の「/」または「\」の出現を検索する簡単な方法はあるのでしょうか。

// I have a strstr statement like this -
str = strstr(s, "/");

strstr の 1 回の呼び出しで最初に出現する a / または を検索できるように変更できるかどうか疑問に思っていました。\

4

4 に答える 4

9

strcspn を試してください:

Get span until character in string
str1 をスキャンして、str2 の一部である文字の最初の出現を探し、この最初の出現の前に読み取られた str1 の文字数を返します。

検索には、終端のヌル文字が含まれます。したがって、str1 に str2 の文字が見つからない場合、この関数は str1 の長さを返します。

例:

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

const char* findany(const char* s, const char* keys)
{
    const char* tmp;
    tmp = s + strcspn(s,keys);
    return *tmp == '\0' ? NULL : tmp;
}

int main ()
{
  char str1[] = "abc\\123";
  char str2[] = "abc/123";
  char str3[] = "abc123";
  char keys[] = "/\\";
  printf("1: %s\n",findany(str1,keys));
  printf("2: %s\n",findany(str2,keys));
  printf("3: %s\n",findany(str3,keys));
  return 0;
}

編集:上記strpbrkと同じことを行いfindanyます。その機能が表示されませんでした:

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

int main ()
{
  char str1[] = "abc\\123";
  char str2[] = "abc/123";
  char str3[] = "abc123";
  char keys[] = "/\\";
  printf("1: %s\n",strpbrk(str1,keys));
  printf("2: %s\n",strpbrk(str2,keys));
  printf("3: %s\n",strpbrk(str3,keys));
  return 0;
}

出力 (両方の):

1: \123
2: /123
3: (null)
于 2012-10-11T18:14:19.330 に答える
2

まさにそれを行う C 関数があります - strpbrk()

于 2012-10-11T20:47:24.533 に答える
1

strstrへの1回の呼び出しで「/」または「\」の最初の出現を検索できるように変更できるかどうか疑問に思いました

strtokソース文字列を変更するを使用できます(またはを参照strtok_r)。または、次を使用できますstrcspn

The strcspn() function shall compute the length (in bytes) of the maximum
initial segment of the string pointed to  by  s1  which consists entirely
of bytes not from the string pointed to by s2.

それで

p = s + strcspn(s, "/\\");

/、\、または最後のNUL文字(\も//も見つからなかった場合)へのポインタを返します。

もちろん、strchr2回実行して、NULLでない場合は、どちらが最初かを確認することもできます。

于 2012-10-11T18:14:26.303 に答える
0

strchr 関数を使用して、最初に出現する文字を見つけることができます。

pos_of_first_slash=strchr(s, '/');

C 文字列 str 内で文字が最初に出現する位置へのポインターを返します。

終端のヌル文字は、C 文字列の一部と見なされます。したがって、文字列の末尾へのポインターを取得するためにも配置できます。

str 内で文字が最初に出現する位置へのポインターを返します。文字が見つからない場合、関数はヌル ポインターを返します。

于 2012-10-11T18:13:51.693 に答える