0

メイン関数から呼び出し可能な文字列関数を作成しようとしていますが、これによりセグメンテーション違反が発生します...何かアイデアはありますか???

文字列を返す文字列関数を作成することも可能ですか..

#include <iostream>
#include <stdio.h>
#include <sstream>


using namespace std;

string callMe(string& k){

    cout << "String from callMe: " << k;

}


int main(){

   string k;

   k = "K SHK";

   cout << "String from main function: " << k << endl;

   callMe(k);

}

アップデート:

そのコンパイルはうまくいきます..

[root@server dev]# ./stringtest 
String from main function: K SHK
Segmentation fault
4

6 に答える 6

7

関数callMeは文字列を返すことが期待されていますが、何も返しません。

コンパイラの警告を有効にしている場合、これについて警告されます ( -Wall と -Wextra を追加することをお勧めします)。

戻り値の型を からstringに変更することで解決できますvoid

ただし、このmain関数には return ステートメントは必要ありません (ただし、初心者には を追加するだけの方がよい場合がありますreturn 0;)。

C++ 標準から:

main の return ステートメントには、main 関数を離れ (自動保存期間を持つオブジェクトを破棄する)、戻り値を引数として std::exit を呼び出すという効果があります。制御が return ステートメントに遭遇せずに main の最後に達した場合、結果は「return 0;」を実行することになります。

于 2012-08-19T10:19:28.963 に答える
6

問題は、関数が を返すと宣言したstringが、返さないことです。

これを修正するには、次の 2 つの方法があります。

  • 文字列を返すつもりがない場合は、次のように変更callMeします

    void callMe(string& k);

  • 文字列を返すつもりだった場合は、return ステートメントを追加してそうします。

    return "I'm returned from callMe, called with " + k;

さらに、いくつかのスタイル コメント:

  • 可能であれば、定義の時点で変数を初期化することをお勧めします。あなたの場合、次のように書きます。

    string k = "K SHK";
    

    また

    string k("K SHK");
    

    後で文字列を変更するつもりがない場合は、const偶発的な変更をキャッチするために is as を定義することも検討してください (たとえば、 の=代わりに を使用==):

    string const k = "K SHK";
    
  • の引数を変更しない場合はcallMe、const への参照を使用する必要があります。

    void callMe(string const& k);
    

    それぞれ

    string callMe(string const& k);
    

これにより、次のように、定数文字列と文字列リテラルで関数を呼び出すことができますcallme("I'm a string literal");

于 2012-08-19T10:18:51.733 に答える
1
void callMe(string& k){

    cout << "String from callMe: " << k;

}

文字列を返す関数として Callme を宣言し、反対側では何も返さないため、そのようなコードはセグメンテーション違反を引き起こす可能性があります (eax の値が定義されていないため)。

于 2012-08-19T10:18:22.703 に答える
0

文字列を返す文字列関数を作成することも可能ですか..確かに。上記の元のコードを少し変更すると、次のようになります...

string callMe(string& k){
    string returnValue("String from callMe: ");
    returnValue += k;
    cout << returnValue << endl;
    return returnValue;
}
于 2012-08-19T11:01:48.827 に答える
0

callMe() および main() 関数は何かを返す必要があります...

于 2012-08-19T10:20:15.603 に答える
0

あなたの機能callMeにはありませんreturn。試す:

void callMe(string& k)
{
   cout << "String from callMe: " << k;
}

main()関数はint(通常は 0)を返す必要があります。

Ps: 関数で文字列 k を変更しない場合は、 const 参照を使用してくださいconst string&

于 2012-08-19T10:21:24.820 に答える