Я хочу что-то сделать со строкой, используя функцию index и rindex в c++17, но когда я компилирую программу, выскочила эта ошибка:
debug.cpp: In function ‘int main()’:
debug.cpp:7:27: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
7 | char* index_first = index(str,'c');
| ~~~~~^~~~~~~~~
| |
| const char*
debug.cpp:9:27: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
9 | char* index_last = rindex(str,'c');
| ~~~~~~^~~~~~~~~
| |
| const char*
Затем я проверил эту программу в Интернете, все определения функций index и rindex, которые я видел, одинаковы:
char* index(const char* s,int c);
char* rindex(const char* s,int c);
И вот мой код отладки:
#include <stdio.h>
#include <string.h>
int main()
{
const char* str = "abcdefgabcdefg";
char* index_first = index(str,'c');
printf("the first index is %ld\n",index_first - str + 1);
char* index_last = rindex(str,'c');
printf("the last index is %ld\n",index_last - str + 1);
return 0;
}
Я компилирую его, используя:
g++ -o debug debug.cpp -std=c++17
Я хочу знать, почему я не могу этого сделать, и правильный способ использования функций index и rindex и (или) правильную функцию определяет, пожалуйста.
Вот моя среда:
Ubuntu LTS 20.04 (x64)
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Спасибо за помощь.
POSIX.1-2008 удаляет спецификации index() и rindex(), вместо них рекомендуются strchr() и strrchr().
Вы пытаетесь присвоить возвращаемые указатели типа const char *, которые используются в функциях, указателям типа char *
На самом деле функции, которые вы вызываете, объявляются как
const char* index(const char* s,int c);
const char* rindex(const char* s,int c);
В С++ функции могут быть перегружены, например
const char* index(const char* s,int c);
const char* rindex(const char* s,int c);
И
char* index(char* s,int c);
char* rindex(char* s,int c);
Так же, как некоторые другие стандартные функции C, например, стандартная функция C strchr.
Поэтому вы должны написать
const char* index_first = index(str,'c');
printf("the first index is %td\n",index_first - str + 1);
const char* index_last = rindex(str,'c');
printf("the last index is %td\n",index_last - str + 1);
Результат вычитания двух указателей имеет целочисленный тип со знаком ptrdiff_t. Поэтому вам нужно использовать спецификатор преобразования %td вместо %ld.
Из стандарта C (7.21.6.1 Функция fprintf)
7 Модификаторы длины и их значения: t Указывает, что следующий спецификатор преобразования d, i, o, u, x или X применяется к ptrdiff_t или соответствующему целому без знака. тип аргумента; или что следующий спецификатор преобразования n применяется к указатель на аргумент ptrdiff_t.
Попробуйте const char* index_first = index(str,'c');, похоже, ваш string.h не соответствует справочным страницам.