مشكلات اقتباس واحدة مع C ++ Find واستبدال الوظيفة

StackOverflow https://stackoverflow.com/questions/1087088

  •  23-08-2019
  •  | 
  •  

سؤال

هنا هو رمزي لإيجاد تسلسل في سلسلة واستبداله بآخر:

std::string find_and_replace( string &source, string find, string replace )
{
    size_t j;
    for ( ; (j = source.find( find )) != string::npos ; )
    {
        source.replace( j, find.length(), replace );
    }
    return source;
}

كل شيء يعمل بشكل جيد عندما أسمي شيئا مثل:

find_and_replace(test, "foo", "bar")

طلبي يتطلب مني استبدال اقتباس واحد مع عليستين واحدا، وليس اقتباس مزدوج. على سبيل المثال، أود الاتصال:

find_and_replace(test, "'", "''")

ولكن كلما أدعو هذا، تتجمد الوظيفة لسبب ما. لا أحد يعرف ما قد يكون سبب هذه المشكلة؟

تحرير: بناء على الإجابات التي حصلت عليها، فقد قمت بإصلاح الرمز:

std::string find_and_replace( string &source, string find, string replace )
{
    string::size_type pos = 0;
    while ( (pos = source.find(find, pos)) != string::npos ) {
        source.replace( pos, find.size(), replace );
        pos += replace.size();
    }
    return source;
}

آمل أن يساعد هذا بعض الأشخاص الذين لديهم نفس المشكلة.

هل كانت مفيدة؟

المحلول

لديك حلقة لانهائية لأن حالتك لا تتحرك إلى الأمام. أنت دائما تعمل j = source.find( find ), ، لكنك تستبدل ' مع '', ، لذلك أنت دائما تجد أول نقاصا أول في كل مرة وإضافتها مؤقتا جديدة إلى السلسلة.

تحتاج إلى التأكد من أنك لا تتطابق مع نفس النقاط الفاصلة مرتين من خلال التحرك حيث تقوم بمسح الأمام في كل مرة تقوم فيها باستبدال شيء ما.

ال find تأخذ الدالة معلمة ثانية وهي موضع البداية في السلسلة للبحث عن السلسلة الفرعية. بمجرد العثور على موقف المباراة الأولى، حرك موضع البداية حتى هذا الموضع بالإضافة إلى طول السلسلة التي تحل محلها بها.

نصائح أخرى

لأنك تحل محل "مع"، ثم ابحث عن "مرة أخرى، وإيجاد أول تلك التي وضعتها هناك للتو. التي تحل محلها. وما إلى ذلك وهلم جرا.

تحاول استبدال السلسلة نفسها التي أضفتها.

من الأفضل أن تعمل من الأفضل إلى اليسار. هذا يعمل بالنسبة لي:

const std::string& replacestring( std::string& strString, const std::string& strOld, const std::string& strNew )
{
    for ( int nReplace = strString.rfind( strOld ); nReplace != std::string::npos; nReplace = strString.rfind( strOld, nReplace - 1 ) )
    {
        strString.replace( nReplace, strOld.length(), strNew );
        if ( nReplace == 0 )
            break;
    }
    return strString;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top