Я пытаюсь создать программу, которая удаляет гласные из строки, добавляет их в вектор, а затем дает пользователю возможность снова получить исходный код.

В моем коде есть это:

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++]; }
-1
hfa2010 12 Мар 2014 в 01:00
Я думаю, вы пропустили несколько пустых строк...
 – 
crashmstr
12 Мар 2014 в 01:02
 работал не так хорошо.
        
 – 
hfa2010
12 Мар 2014 в 01:03
Отступ кода с 4 пробелами для начала, не используйте табуляцию. Вы можете нажать на оранжевый? чтобы увидеть больше информации/помощи.
 – 
crashmstr
12 Мар 2014 в 01:03
s[j] приводит к одному char, т.е. 'a', тогда как "a" является строковым литералом, который преобразуется в const char *
 – 
YoungJohn
12 Мар 2014 в 01:04
1
"e" не имеет типа char (это строковый литерал, а не символьный).
 – 
Alan Stokes
12 Мар 2014 в 01:05

5 ответов

Лучший ответ

Strcmpi для сравнения строк. Первый аргумент для strcmpi имеет тип char, когда он ожидает char*.

Для сравнения отдельных символов достаточно s[j]=='e' или tolower(s[j])=='e', если вам нужно, чтобы регистр регистрировался. Вам нужно будет включить ctype.h. для tolower.

5
Benesh 12 Мар 2014 в 01:09
1
== не зависит от регистра.
 – 
Barmar
12 Мар 2014 в 01:04
Да, сначала я пытался это сделать, но это не сработало. Я в конце вопрос, что было раньше.
 – 
hfa2010
12 Мар 2014 в 01:05

Аргументы для 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') {
        ...
    }
}
2
Barmar 12 Мар 2014 в 01:09

Вы не хотите использовать strcmp или любой из его вариантов. Поскольку вы хотите знать, содержит ли строка гласные или нет, вы можете использовать поиск подстроки с помощью strstr.

0
reza.safiyat 12 Мар 2014 в 01:09

Вы неправильно используете функцию strcmpi. Его первый параметр имеет тип const char *, а вы передаете аргумент типа char. То есть функция ожидает строку, в то время как вы передаете только один символ.

Более того, эта функция не является стандартной функцией C / C ++. Так что его не следует использовать.

Вы можете добиться того же результата, используя следующий подход

char vowels[] = "aeiou";
//...
if ( strchr( vowels, tolower( s[j] ) )
{
   std::cout << s[j] << " is a vowel" << std::endl;
}
0
Vlad from Moscow 12 Мар 2014 в 01:26

Вам уже сказали, что 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 проверяет, находится ли символ в строке. Вы можете использовать его как ярлык для обозначения всех гласных в явных сравнениях.

0
M Oehm 12 Мар 2014 в 01:34