0

より大きな文字列内で検索した後、文字列の一部の長さを見つけたかったのです。

バイナリデータを扱っているため、strlen を使用できません。

char *temp= "this is some random text";
char *temp1 = strstr(temp,"some");
int len = strlen(temp);
int len1 =0;

len1 = temp+len - temp1; 

「ランダムなテキスト」の長さを取得する

len1 は負の値を返します(正の値でも間違っています)

4

2 に答える 2

2

データが NULL で終了していない場合、strlen() を呼び出せないのと同じ理由で、そのデータに対して strstr() を呼び出すことはできません。これを行うと、データの最後までスキャンしてしまう可能性があります。そこに一致するものが見つかった場合 (可能性は十分にあります。配列の末尾を超えて読み取ってもプログラムがクラッシュする保証はありません)、ポインター演算負の値を返します。小さい方。

一方、データが実際に適切に NULL で終了している場合、問題はおそらく strstr() が部分文字列を見つけられず、NULL を返すことです。NULLをチェックしていますか?それ以外の場合は、次のようになります。

len1 = temp + len - (char*)NULL;
于 2013-06-21T08:13:57.273 に答える
1

最終的な答え:

を探していlen - (temp1 - temp)ます。最初の部分の長さは ですtemp1 - temp。文字列全体の長さからそれを差し引いて、残りの部分の長さを取得します。

より長い答え:

(これstrlenは、適切なテキストメッセージでのみ機能する場合でも、例で使用したものです)入力の最後の部分の長さに\0単純に使用できる文字が見つかるまで続きます。strlen(temp1)2 回呼び出すとパフォーマンスが低下することが本当に心配な場合はstrlen(本当に?)、 を使用できますlen - (temp1 - temp)

入力の最初の部分の長さに関心がある場合にのみ、ポインターの減算を行う必要があります。

\0非終端位置に含まれるバイナリ配列を操作する場合は、コードでまったく使用できません。strlenただし、入力全体の長さを指定する方法が必要です。これを整数変数に入れるか、長さ計算関数に特定の区切り文字を入れます。

長さの整数変数がある場合、入力の最初の部分の長さはポインター減算によって取得されるため、行う必要があるのはlen - (temp1 - temp).

長さを計算する関数がある場合は、単にtemp1引数として呼び出します。

PSstrstr : NULLを返すかどうかを確認することを忘れないでください(ちなみに、バッファ内にstrstrバイナリデータがある場合は使用できません)\0

于 2013-06-21T08:11:40.513 に答える