Я пытаюсь скомпилировать простую строку, но она не работает... почему?
Мой компилятор - 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
НЕ будет иметь доступ к последнему символу.