-3

C ++で正規表現に一致する次のプログラムを作成しました

#include <regex.h>
#include <iostream>

using namespace std;

/*
* Match string against the extended regular expression in
* pattern, treating errors as no match.
*
* return true for match, false for no match
*/


bool match(const char *string, char *pattern)
{
    int status; regex_t re;

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0)
        return false;
    /* report error */

    status = regexec(&re, string, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        return false; /* report error */
    }
    return true;
}

int main()
{
    string str = "def fadi 100";
    bool matchExp = match(str.c_str(), "^[Dd][Ee][Ff][' '\t]+[A-z]+([,])?[''\t]+[0-9]+$");
    cout << (matchExp == true ? "Match": "No match") << endl;
}

プログラムは期待どおりに正常に動作しますが、gcc を使用して -Wall -Werror 引数 (Linux 環境) を使用してコードをコンパイルすると、次のような非常に迷惑な警告メッセージが表示されます。

main.cpp: In function ‘int main()’:
main.cpp:33:90: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

str.c_str()と同じであるとコンパイラに強制的に信じさせる方法はありchar * strますか? もしそうなら、どのように?

4

4 に答える 4

8

いいえ、ありません。この変換は C++03 では推奨されておらず、C++11 では違法です。しないでください。

その変換の非推奨は、文字列リテラルが読み取り専用であるためconstです。non- へのポインターを使用してそれらにアクセスすると、オブジェクトconst charが変更される可能性がありconst、未定義の動作が呼び出される可能性があります。警告は煩わしいものではありません。これは、アプリケーションがクラッシュする可能性やさらに悪い事態を回避するためのものです。

また、警告メッセージの読み方も間違っています。ではなくc_str()、文字列リテラルを として渡すことですchar *

コードを実際に修正する唯一の方法は、 の 2 番目のパラメーターmatchを be const char *、 notchar *に変更し、渡された文字列をその関数の内部にある新しいバッファーにコピーすることです (main()内部バッファーを使用すると、定型文が少なくなるためです)。呼び出し側)。


質問には「C++」というタグが付けられているため、まったく異なる解決策を提案したいと思います: Boost.Regex

于 2013-06-26T18:22:23.907 に答える
1

問題は、文字列リテラルは const char のポインターにのみ割り当てられる必要があるため、char const* パターンを取るように match を変更する必要があることです (これは、文字列リテラルを渡すときに可能になるはずです)。

于 2013-06-26T18:22:07.337 に答える
1

関数の 2 つのパラメーターを一致させますconst char *。警告はそのためです

于 2013-06-26T18:27:32.227 に答える