Я пытаюсь скомпилировать простую строку, но она не работает... почему?

Мой компилятор - Code::Blocks. Я пытаюсь исключить вокал из последовательности символов.

#include <iostream>
#include <cstring>
using namespace std;
char sir[256];
int i=0;

int main (){
cout<<"sir=";cin.getline(sir,256);
for (i=strlen(sir);i>0;i--){
    if (strstr(sir[i],'aeiou')==0){
        strcpy(sir+i,sir+i+1);
        break;}}
cout<<"sir="<<sir<<"\n";
return 0;
}

Я получаю следующую ошибку:

error: call of overloaded 'strstr(char&, int)' is ambiguous
note: candidates are:
note: char* strstr(char*, cost char*) near match

Но я думаю, что проблема в команде strstr...

4 ответа

"aeiou" не является строковым литералом в c/ C++, используйте "aeiou". В c/ C++ строковый литерал представлен внутри " "(двойные кавычки)

Узнайте больше здесь

Так что, видимо, идея состоит в том, чтобы удалить гласные. Как уже говорили другие, используйте "aeiou" и не 'aeiou', Но вам также нужно использовать правильную функцию, чтобы проверить, есть ли у вас гласная. Это strchr(const char* s, int c)не strstr, strchr ищет вхождения c в строке, которая s указывает и возвращает указатель на это вхождение или, если он не найден, указатель на завершающий нулевой символ. Итак, тест в оригинальном коде должен быть:

if (*strchr("aeiou", sir[i] != '\0')

Лично я бы написал это более кратко:

if (*strchr("aeiou", sir[i]))

Как я уже писал в первом комментарии, выражение

strstr(sir[i],'aeiou')

неверно по двум причинам: "для одиночных символов", "для строк", но главная причина в том, что strstr находит происхождение всего, а не символов отдельно.

Попробуй это:

#include <iostream>
#include <cstring>
using namespace std;
char sir[256];
char sir2[256];
int i=0;

int main (){
    cout<<"sir=";cin.getline(sir,256);
    char* reader = sir;
    char* writer = sir2;
    while(*reader) {
        if(*reader!='a' && *reader!='e' && *reader!='i' && *reader!='o' && *reader!='u') {
            *writer = *reader;
            ++writer;
        }
        ++reader;
    }
    *writer = '\0';
    cout<<"sir="<<sir2<<"\n";
    return 0;
}

ststr определяется двумя прототипами функций

const char* strstr( const char* str, const char* target );

      char* strstr(       char* str, const char* target );

ваш звонок звонит как

strstr(sir[i],'aeiou')

первый аргумент - это тип char, а не тип char *, поэтому компилятор знает, как сопоставить его с const char * или char *

Также проверьте ваш индекс цикла как

 i=strlen(sir) 

будет индексировать массив символов и

i > 0 

НЕ будет иметь доступ к последнему символу.

Другие вопросы по тегам