Рефакторинг унаследованного кода, который использует '§' char в коде


У меня есть старый код (может быть 20 лет), как показано ниже. Где они используют non ASCII '§' char в коде. Сначала они готовят SELECT запрос и SELECT запрос выглядит так...

SELECT 'ERROR_ID=§' || ERROR_ID ||  '§'  || ' AND ' ||  'DAT=:' || ...

Они, используя ниже код при подготовке SELECTзапрос. функции strcat(запрос, "§" );

От SELECT результат запроса , который все еще содержит '§'они делают сравнение, как показано ниже, и если '§' голец присутствует в char массив, они заменяют его single quotes. С их помощью non ASCII char '§' в коде, я бы пересаживать проблема, где '§' не получает заменены single quotes и они отображаются как знаки вопроса '?' в лог-файл. Ниже приведен код, где они делают замену

len_before=strlen(file_str);
k=l=end=0;
while(end==0)
{
    if(file_str[k] == '\'') 
    {
        strcpy( result,(char*)&file_str[k]);
        file_str[k] = '\'';
        strcpy((char*)&file_str[k+1],result);
        k++;
    }
    else
    {
        if((char)file_str[k]=='§') // Replace '§' by single quotes.
        {
            strncpy((char*)&file_str[k],"'",1);
        }
    }
    k++;
    l++;
    if(l>len_before)
        end=1;
};

Так что я рефакторинг кода, чтобы не использовать не ASCII символы типа char '§' с последовательностью символов, как сказать ("!-!") для приготовления SELECT запрос, как показано.

strcat(query, "!-!" );

И результат SELECT запрос я должен заменить эту последовательность символов ("!-!") с одинарными кавычками. Ниже рефакторинг кода...

string replaceAll(string inputString, string stringToFind, string stringToReplace)
{
    int found = inputString.find(stringToFind);
    while (found != string::npos)
    {
        inputString.replace(found, stringToFind.length(), stringToReplace);
        found = inputString.find(stringToFind, found + stringToReplace.length());
    }
    return inputString;
}

{
    // First replace every occurance of single quotes with double single quotes.
    string myString(file_str);
    myString = replaceAll(myString, "\'", "\'\'");

    // Replace the sequence of chars "!-!" with single quotes.
    myString = replaceAll(myString, "!-!", "\'");
}

Вопросы:

  • Я хотел бы знать, если есть какие-то ямы водопад, который я должен заботиться?
  • Какая последовательность символов может быть использован вместо "!-!"?
  • Есть ли significane Чара '§' (я считаю, что код использует '§' в качестве разделителя)в коде, так как они подключаются к БД и выборки данных?


140
0
задан 27 марта 2018 в 09:03 Источник Поделиться
Комментарии
1 ответ

Я не вижу вас через std::вы, конечно, не ставил using namespace std где-то в коде, верно?

Я нахожу ваши имена параметров немного запутанным. stringToReplace на самом деле замена. Строку, которую вы хотите заменить stringToFind. Может быть, использовать что-то вроде replaceWith или просто replacement для второго параметра вместо.

Существует несоответствие типов, которые компилятор должен был попасться (без предупреждения включена?). В возвращаемое значение find size_t.

Вы также можете пройти первый аргумент как ссылку, а две другие-в качестве константной.

2
ответ дан 27 марта 2018 в 10:03 Источник Поделиться