Ошибка при компиляции кода

MRG_Serejka

#include <iostream>
using namespace std;
 
int find_substr(char *sub, char *str);
 
int main()
{
 
int index;
index = find_substr("три", "один два три и четыре");
cout << "Индекс равен " << index; 
return 0;
}
 
int find_substr(char *sub, char *str)
{
int t;
char *p, *p2;
for(t=0; str[t]; t++)
        {
        p = &str[t];
        p2 = sub;
        while(*p2 && *p2==*p)
                {
                p++; 
                p2++;
                }
        if(!*p2) return t;
        }
return -1;
}
выводит при компиляции : warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] index = find_substr("три", "один два три и четыре"); помогите разобраться.
10 ответов

MRG_Serejka

#include <iostream>
using namespace std;
 
int find_substr(const char *sub, const char *str);
 
int main()
{
    const auto index 
        = find_substr("три", "один два три и четыре");
    
    cout << "Индекс равен " << index << '\n'; 
}
 
int find_substr(const char *sub, const char *str)
{
    for(int t=0; str[t]; ++t)
    {
        const char* p = &str[t];
        const char* p2 = sub;
        
        while(*p2 && *p2==*p)
            ++p, ++p2;
        
        if(!*p2) 
            return t;
    }
 
    return -1;
}


MRG_Serejka

hoggy, А можете сказать(разъяснить) , что вы здесь сделали чтобы я знал в дальнейшем почему эта ошибка выходит


MRG_Serejka

А можете сказать(разъяснить) , что вы здесь сделали чтобы я знал в дальнейшем почему эта ошибка выходит
это не ошибка, а предупреждение. компилятор услужливо подсказывает вам, что в коде есть проблема.и проблема эта заключается в следующем. вот здесь:
= find_substr("три", "один два три и четыре");
вы передаете в функцию указатели на литерные константы. это - константы, понимаете? из нельзя изменять.однако в первоначальном вашем варианте фигурировало:
int find_substr(char *sub, char *str);
указатели на не константы.то есть, через эти указатели можно изменить содержимое объекта, на который такой указатель указывает.по факту, вы конечно не пытались изменять значения передаваемых констант. но сам по себе ваш код это допускает.попытка изменить то, что было рождено как константа приводит к непредсказуемым последствиям.об этом и пытался предупредить вас компилятор. все что я сделал - просто заменил обычный указатель, на указатель на константу.


MRG_Serejka

MRG_Serejka, Так в предупреждении сказано, что преобразуйте в константу. Товарищ hoggy добавил
const auto index


MRG_Serejka

const auto index
не имеет ни малейшего отношения к предупреждению компилятора.было:
int find_substr(char *sub, char *str);
стало:
int find_substr(const char *sub, const char *str)


MRG_Serejka

hoggy,


MRG_Serejka

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


MRG_Serejka

hoggy, Я скопировал ваш код , скомпилировал. Теперь компилятор вывел такую ошибку : program41.cpp: In function ‘int main()’: program41.cpp:8:16: error: ‘index’ does not name a type const auto index ^ program41.cpp:11:43: error: ‘index’ was not declared in this scope cout << "Индекс равен " << index << '\n' ; ^hoggy, может дело в моем компиляторе ? или то что я работаю под убунту ?


MRG_Serejka

может дело в моем компиляторе ?
скорее всего, вы просто не включили опцию поддержки с++11. либо ваш компилятор слишком стар.по хорошему, вам стоит с этим разобраться, и научиться включать с++11. но можно и не заморачиваться:
#include <iostream>
using namespace std;
 
int find_substr(const char *sub, const char *str);
 
int main()
{
    const int index 
        = find_substr("три", "один два три и четыре");
    
    cout << "Индекс равен " << index << '\n'; 
}
 
int find_substr(const char *sub, const char *str)
{
    for(int t=0; str[t]; ++t)
    {
        const char* p = &str[t];
        const char* p2 = sub;
        
        while(*p2 && *p2==*p)
            ++p, ++p2;
        
        if(!*p2) 
            return t;
    }
 
    return -1;
}


MRG_Serejka

Lemanos, подскажи пожалуйста как работает цикл while while(*p2 && *p2==*p) ++p, ++p2; и как правильно прочесть его