2017-01-15 17 views
0

私の "C"コードはLinux(コンパイラggdb3、C99)でコンパイルされませんが、Visual Studioでうまく動作しますか?ここ エラーのメッセージ:コンパイラの違い。 C言語

20:1: error: control may reach end of non-void function [-Werror,-Wreturn-type] }

#include <stdio.h> 
// Function to determine if one character string exists inside another string. 
int findString(char source[], char searching[]) 
{ 
    int i = 0, j = 0; 

    for (; source[i] != '\0'; i++) { 
     if (source[i] == searching[j]) 
      if (source[i + 1] == searching[j + 1] && 
       source[i + 2] == searching[j + 2]) 
       return i; 
      else 
       return -1; 
    } 

} 

int main(void) 
{ 
    int index = findString("a chatterbox", "hat"); 

    if (index == -1) 
     printf("No match are founded\n"); 
    else 
     printf("Match are founded starting index is %i\n", index); 

    return 0; 
} 

私は機能にEDDにこれを試してみたが、それはあなたが括弧を使用する必要があるので、

if (source[0] == '\0') 
     return -1; 
+4

エラーメッセージが示すように、 'find'文の最後に' return'文を挿入するのを忘れてしまいました。また、Visual Studio C/C++コンパイラは、CコンパイラよりもC++コンパイラです。 – Xaver

+1

は毎回「警告としてエラー」を使用します。それらの警告はirlエラーです。最初に無視すると、後で難しい方法で直面することになります。 – bansi

+1

コンパイラはデフォルトでこのようなことに不満を持ちません。したがって、Visual Studioには特に驚くことではありません。 Linuxコンパイラは常にこのようなことを診断するわけではありませんが、この問題を拾い読みしてエラーとして扱うためのコマンドラインオプションが与えられているため、 "Linuxコンパイラ"には驚くことではありません。 Visual Studioのドキュメントを読んだら、同等のオプションまたはオプションのセットを見つけることができます。解決方法は、関数を通るすべての実行パスに 'return'ステートメントがあることを確認することです。 – Peter

答えて

1

まずCは、Pythonではありません助けていません適切に(インデントするだけではなく)。

あなたのfindString()機能に問題があります。角かっこを正しく配置すると、if (source[i] != searching[j])にはreturnという文がありませんが、intを返すと予想されます。非void型関数から復帰する

if (source[i] == searching[j]) 
{ 
    ... 
} 
// what if source[i] != searching[j] 
// you do not have any return statement for a function returning int 

失敗は未定義の動作が発生します。

それは、C++とmore clearだC11(rubenvbによる)

6.9.1 Function definitions

12 If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.

を引用:

[...]Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.[...]

+1

訂正:何も返されません。プログラムがクラッシュしたり、子供を食べたり、kthuluを呼び出す可能性がある、未定義の動作を引き起こします。 – rubenvb

+1

@rubenvb真実ですが、私はC言語のソースを見つけられませんでした。 – artm

+0

子供をキャストすると 'C'が鶏を喜んで受け入れます。あなたがそれをしたいと思えばまず考えてください。 – bansi

2

あなたが実際に単なる警告を取得しているように、しかし、あなたがLinuxのコンパイラを与えてくれたので、それが見えますコマンドライン引数-Werrorは警告をエラーとして扱います。 Visual Studioのコンパイラ出力を見ると、同様の警告が表示されます。

+6

Visualの下にある出力ウィンドウを見てくださいスタジオ。 「C4715:findStringはすべての制御パスではない」と警告します(残りはコマンドウィンドウで隠されています)。 – bace1000

+0

警告C4715ありがとうございました! @ bace1000 – Yellowfun

+3

警告ですが、コード内の実際の問題を指摘しているので、無視しても安全ではありません。 – interjay

関連する問題