Я пытаюсь создать программу, которая удаляет гласные из строки, добавляет их в вектор, а затем дает пользователю возможность снова получить исходный код.
В моем коде есть это:
char s[20];
И вскоре после этого у меня есть это сравнение:
for(j=0;j<tam;j++)
{
if(strcmpi(s[j],"a")==1 ||
(strcmpi(s[j],"e")==1 ||
(strcmpi(s[j],"i") ==1||
(strcmpi(s[j],"o") ==1||
(strcmpi(s[j],"u")==1))
{
Итак, если массив - char, а гласные - char (""), почему компилятор выдает мне эту ошибку ?:
[Предупреждение] передача аргумента 1 из `strcmpi 'делает указатель из целого числа без приведения
ИЗМЕНИТЬ
Как кто-то сказал, правильным является s [j] == 'a', но это неправильный результат. Если поставить машину, результат все равно машина. Не знаю почему.
if(s[j] == 'a' ||
s[j] == 'A' ||
s[j] == 'e' ||
s[j] == 'E' ||
s[j] == 'i' ||
s[j] == 'I' ||
s[j] == 'o' ||
s[j] == 'O' ||
s[j] == 'u' ||
s[j] == 'U')
{
s[j] = s[j++]; }
5 ответов
Strcmpi
для сравнения строк. Первый аргумент для strcmpi
имеет тип char, когда он ожидает char*
.
Для сравнения отдельных символов достаточно s[j]=='e'
или tolower(s[j])=='e'
, если вам нужно, чтобы регистр регистрировался. Вам нужно будет включить ctype.h.
для tolower
.
==
не зависит от регистра.
Аргументы для strcmpi
должны быть строками, но s[j]
- это всего лишь один символ, а не строка. Вы можете использовать ==
для прямого сравнения символов. Чтобы получить сравнение без учета регистра, сначала получите версию символа в нижнем регистре и сравните ее.
for (j = 0; j < tam; j++) {
char lower = tolower(s[j]);
if (lower == 'a' || lower == 'e' || lower == 'i' || lower == 'o' || lower == 'u') {
...
}
}
Вы не хотите использовать strcmp
или любой из его вариантов. Поскольку вы хотите знать, содержит ли строка гласные или нет, вы можете использовать поиск подстроки с помощью strstr
.
Вы неправильно используете функцию strcmpi
. Его первый параметр имеет тип const char *
, а вы передаете аргумент типа char
. То есть функция ожидает строку, в то время как вы передаете только один символ.
Более того, эта функция не является стандартной функцией C / C ++. Так что его не следует использовать.
Вы можете добиться того же результата, используя следующий подход
char vowels[] = "aeiou";
//...
if ( strchr( vowels, tolower( s[j] ) )
{
std::cout << s[j] << " is a vowel" << std::endl;
}
Вам уже сказали, что strcmpi
- неправильный способ проверки отдельных символов. Это ответ на редактирование вашего вопроса, где вы спрашиваете об удалении гласных.
Если вы хотите сохранить исходную строку, вам потребуется дополнительная память для строки без согласных. Вам также понадобятся два индекса, потому что после того, как вы пропустили гласную в исходной строке, индексы не синхронизированы. Вот пример реализации:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char orig[] = "Jackdaws love my big sphinx of quartz.";
char cons[sizeof(orig)]; // Make new char buffer as big
// as the original
int i, j;
j = 0;
for (i = 0; orig[i]; i++) {
if (strchr("AEIOUaeiou", orig[i]) == NULL) {
cons[j++] = orig[i];
}
}
cons[j] = '\0'; // Terminate consonant string
printf("was: '%s'\n", orig);
printf("is: '%s'\n", cons);
return 0;
}
Выражение strchr
проверяет, находится ли символ в строке. Вы можете использовать его как ярлык для обозначения всех гласных в явных сравнениях.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
s[j]
приводит к одномуchar
, т.е.'a'
, тогда как"a"
является строковым литералом, который преобразуется вconst char *