строка не копируется правильно и показывает ошибку: невозможно преобразовать 'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string <char>}' - PullRequest
0 голосов
/ 17 апреля 2020

Я пытался создать подстроки точно на половину длины исходной строки, а затем сортировал их в порядке их кодов ASCII и, наконец, проверял их равенство с помощью библиотечной функции strcmp (). (То есть я пытался проверить, можно ли разделить родительскую строку на две равные половины.) Вот что я сделал:

  1. Взял ввод родительской строки от пользователя по cin.

  2. Затем я использовал переменную hlength для хранения значения половины длины исходной строки.

  3. Теперь я объявил две строки одинаковой длины (равно hlength), так что первая половина строки копируется в подстроку с именем "s1", а остальная половина копируется в подстроку "s2". я использовал циклы для копирования элементов строки.

  4. Чтобы проверить, правильно ли скопированы строки, я напечатал каждый элемент строки сразу после копирования, используя cout << </em>, как вы можете видеть в прилагаемом коде.

  5. До сих пор все выглядело хорошо, поскольку отдельные элементы при печати были правильными.

  6. Но !! возникает ситуация, с которой я никогда не сталкивался: когда я пытался напечатать полную строку, используя cout << </em> Вывод был пустым.

  7. Позже вместо печати строк я просто попытался сравнить их с функцией strcmp (), но это привело к ошибке : невозможно преобразовать 'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string}' в 'const char 'для аргумента от' 1 'до' int strcmp (const char *, const char *) '*

#include <bits/stdc++.h>
#define fastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define llt long long int
using namespace std;
int main()
{
    int length,hlength,i,result;
    string s;
    cin>>s;
    length =  s.length();
    hlength = length/2;
    string s1,s2;
    for(i = 0; i< hlength;i++)
    {
        s1[i] = s[i];
        cout<<s1[i]<<endl; //each element gets printed successfully
    }
    for(i = 0; i< hlength ; i++)
    {
        s2[i] = s[length -1 - i];
        cout<<s2[i]<<endl; //the elements are printed successfully, but obviously in the reverse order( order not matters)
    }
    cout<<s1<<endl<<s2; // no strings printed
    sort(s1.begin(),s1.end());
    sort(s2.begin(),s2.end());

    result = strcmp(s1 , s2);   //ERROR
    cout<<result<<endl;

    return 0;
}

PS: исходная строка имеет четную длину.

Пожалуйста, помогите мне узнать, почему строка не печатается, а отдельные элементы печатаются правильно. И что означает эта ошибка?

1 Ответ

0 голосов
/ 17 апреля 2020

strcmp ожидает указатели на символы - это то, что говорит вам ваше сообщение об ошибке. Существует string::compare или оператор ==, который вы можете использовать без этой ошибки. См .: Stackexchange Topi c и cppreference .

Для полноты вы можете также преобразовать ваши std::string s в указатели на символы с помощью метода c_str() ваших строк , но это отчасти уродливо.

Вы видите реальные значения, но вы испытываете неопределенное поведение. s1 и s2 инициализируются с нулевой длиной. Оператор [pos] определение:

  • Если pos меньше длины строки, функция никогда не генерирует исключения (гарантия без бросков).
  • Если pos равен длине строки , const-версия никогда не генерирует исключения (гарантия отсутствия бросков).
  • В противном случае это вызывает неопределенное поведение.

    Последний момент - это то, что вы испытываете - возможно, вы записываете часть памяти, которая не принадлежит строке, но все же может получить к ней доступ в той же области видимости. Но когда вы пытаетесь перехватить строку, в блоке памяти строк ничего не записывается. Но кто знает, с его неопределенным поведением может произойти все что угодно.

Раздел Исключительная безопасность в:

http://www.cplusplus.com/reference/string/string/operator [] /

...