コンパイラはあなたがテストを得ればc == 0
が真でなければならないことを理解することは十分にスマートではありませんので、あなたがエラーを取得しています。同じ理由から、テストは完全に不要なので、それを削除してその時点で-1
を返すだけでエラーが修正されます。
あなたがに変更することにより、大幅に簡素化することができます。これは、冗長検査(複数可)を回避
int any(char * a, char * b){
int i, j;
for(i = 0; a[i]; ++i) {
for(j = 0; b[j]; ++j) {
if(b[j] == a[i]) {
return i;
}
}
}
return -1;
}
、完全にあなたのc
変数の必要性を回避し、strlen()
に無償と繰り返し呼び出しを避けることができます。
typedef
ing char *
string
もやや味が悪い。
おそらく、この練習では、効率が上がるためにメモリの効率を交換することによって、配列をルックアップテーブルとして設定し、b
の文字を読み取ってa
終了するか、一致する。これはb
の文字を正確に1回、多くても1回の完全なトラバーサルをa
まで通過させる必要があるため、現在の2次時間ではなく、線形時間アルゴリズムを取得します。例えば
:出力と
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int any(char * a, char * b);
int main(void)
{
printf("'rifle', 'flog': %d\n", any("rifle", "flog"));
printf("'pterodactyl', 'dint': %d\n", any("pterodactyl", "dint"));
printf("'xyzzy', 'fish': %d\n", any("xyzzy", "fish"));
return 0;
}
int any(char * a, char * b)
{
int lookup[CHAR_MAX + 1] = {0};
for (int i = 0; b[i]; ++i) {
lookup[b[i]] += 1;
}
for (int i = 0; a[i]; ++i) {
if (lookup[a[i]]) {
return i;
}
}
return -1;
}
:
[email protected]:~/Documents/src/sandbox$ ./any
'rifle', 'flog': 2
'pterodactyl', 'dint': 1
'xyzzy', 'fish': -1
[email protected]:~/Documents/src/sandbox$
あなたは疑問を持っていますか? – juanchopanza
不完全なコードですが、最後のテストは私がfalseである場合、コントロールは値を返さずに関数の最後に到達します。少なくともコンパイラは 'c'が必ず0であることを知ることができません。 –
なぜ' c'変数が必要ですか?それを削除しようとします。また、復帰後にブレークする必要はありません –