0

関数の char* に値を代入する際に問題がある C++ は初めてです。boolを返す以下のような関数があります

bool Function(char* inString)
{
        int m = strlen(inString);
    char output[1001];
    memset(output , 0 , sizeof(output));
    sprintf_s(output,50,"length is %d",m);

       if(m>5)
        return true;
    if(m<5) 
        return false;

}

関数に加えて、値を持つこの関数内で定義されたローカルの外でこの関数を呼び出すと、「出力」値を取得しようとしています-「長さは-」

やってみた

 bool Function(char* inString)
{
int m = strlen(inString);
    char output[1001];
    memset(output , 0 , sizeof(output));
    sprintf_s(output,50,"length is %d",m);
    sprintf_s(inString,50,output);
  if(m>5)
            return true;
        if(m<5) 
            return false;
}

しかし、inString には既に値があり、次のエラー アクセス違反の書き込み場所 0x00165267 が発生しているため、これは失敗します。

この関数 (文字列の長さに基づく bool 値) と b) 文字列ステートメント「出力」から両方のパラメーターを取得する方法はありますか?

私はあなたの助けに感謝します..

4

4 に答える 4

3

この関数をどのように呼び出していますか? 文字列リテラルで呼び出す場合、その文字列リテラルは読み取り専用メモリにある可能性があります。たとえば、これは失敗します。

bool result = Function( "longer than 5" );

"longer than 5"文字列が読み取り専用メモリにある可能性が高いため、アクセス違反が発生する可能性があります。(必須ではありませんが、最新のコンパイラでは可能です。)

また、Alexandru が上で指摘したように、m==5 のケースをまったく処理しませんでした。

編集:sprintf_s関数を使用して生成している文字列を取得する場合は、いくつかのオプションがあります。

  1. 文字列を出力するバッファを含む 2 番目のパラメータを追加できます。スタック ( your ) でバッファーを宣言する代わりに、char output[1001]このポインターを渡すことができます。すなわち。関数プロトタイプは次のようになりますbool Function(char *inString, char *outString);
  2. bufferstaticを作成し、参照によってそれへのポインターを返します。これには、2 番目のオペランドを追加する必要があります。これは少し醜いです: bool Function(char *inString, char **outString); 次に、コード内で と言いますが*outString = output、これは率直に言って、ひどいものです。
  3. 出力バッファをファイル スコープ配列に移動します。それはさらに醜いです。

上記の #1 の利点の 1 つは、デフォルトの引数と if ステートメントを使用してsprintfオプションにすることができることです。

bool Function(char *inString, char *outString = 0)
{
    int m = strlen(inString);

    if (outString)
        sprintf_s(outString, 50, "length is %d", m);

    return m >= 5;
}

また、スタイル上の注意: を優先char *inStringchar* inStringます。C および C++ では、アスタリスクは宣言されている型の一部ではなく、宣言されている個々のシンボルの修飾子です。a2 つの文字ポインタとを宣言する場合は、 , notbと記述します。char *a, *bchar* a, b

const編集 2: John Carmackの主張を信じている場合const、上記は次のようになります。

bool Function(const char *const inString, char *const outString = 0)
{
    const int m = strlen(inString);

    if (outString)
        sprintf_s(outString, 50, "length is %d", m);

    return m >= 5;
}

const bool関数の戻り値がすでに右辺値であることを除いて、さらに進んで return にすることができると思います...

于 2013-07-02T08:54:40.623 に答える
1

関数から文字列を返すことができるようにします。関数を終了した後でも生きているように文字列を割り当てる必要があります。この例では、文字列をローカルの array( output) に格納していますが、これは関数の scope( ) を超えては存在しません{ }

これを行うにはいくつかの方法があります。

  • 動的に割り当てられたメモリ
  • static保管所

など、どれを使用するかは、使用方法のセマンティクスによって異なります。

出力文字列を関数パラメーターとして渡すだけです。関数内で文字列を割り当てたいので、ポインタを参照渡しする必要があります。

補足として、std::string代わりに使用することを検討してくださいchar *

于 2013-07-02T08:52:45.647 に答える
0

あなたのコードは実際には C++ ではなく、C です。

これを C++ で行う方法を次に示します。ポインタではなく参照を使用していることに注意してください。

bool Function(const std::string &inString, std::string &outString)
{
  int m = inString.size();

  std::stringstream ss;
  ss << "length is" << m;

  outString = ss.str();

  return m >= 5;
}
于 2013-07-02T09:24:19.587 に答える