2014-01-23 2 views
0

Я уже пробовал с другими сообщениями на этом сайте, но это не сработало. Я надеюсь, ты сможешь мне помочь. Проблема состоит в том, чтобы стереть все гласные в заданной строке, затем преобразовать ее в нижний регистр и, наконец, вставить символ '.' перед каждым согласным. Это последнее, что вызывает у меня проблемы.Вставка символа в строку

#include <iostream> 
#include <cstdio> 
#include <ctype.h> 
#include <string> 

using namespace std; 
string cad1; 

char vowels[] = { 
    'A', 'O', 'Y', 'E', 'U', 'I', 'a', 'o', 'y', 'e', 'u', 'i' 
}; 
int size = sizeof(vowels)/sizeof(vowels[0]); 

string ToLowerCase(string text) 
{ 
    for (int i = 0; i < text.length(); i++) 
    { 
     char c = text[i]; 
     if ((c >= 65) && (c <= 90)) 
     { 
      text[i] |= 0x20; 
     } 
    } 
    return text; 
} 


int main() 
{ 
    cin >> cad1; 
    for (int i = 0; cad1[i] != '\0'; i++) 
    { 

     for (int j = 0; j < size; j++) 
     { 
      if (cad1[i] == vowels[j]) 
      { 
       cad1.erase(cad1.begin() + i); 

      } 
     } 

     for (int j = 0; cad1[j] != '\0'; j++) 
     { 
      cad1[j] = tolower(cad1[j]); 
     } 

     cad1 += "."; 
     /* for (int k = 0; cad1[k] != '\0'; k++) { 
       if (k % 2 == 0) { 
        cad1.insert(k, 1, '.');  
       } 

     } */ 
    } 

    cout << cad1 << endl; 
    cin.get(); 
} 
+2

Почему вы не используете 'зЬй :: string'? Я вижу, вы включили его. – 735Tesla

+1

Что касается вашей согласной проблемы - если символ не является гласным, это согласный, правильно? Это поможет вам найти их. – Nabren

+0

Извините за мой первый ответ, я неправильно разобрал ваш вопрос. Я немного поменю, а потом снова отправлю. – 735Tesla

ответ

2

Вы неуместны последнюю петлю. Он должен находиться за пределами внешней петли. Смотрите изменения я сделал в код ниже:

#include <iostream> 
#include <cstdio> 
#include <ctype.h> 
#include <string> 

using namespace std; 
string cad1; 

char vowels[] = { 
    'A', 'O', 'Y', 'E', 'U', 'I', 'a', 'o', 'y', 'e', 'u', 'i' 
}; 
int size = sizeof(vowels)/sizeof(vowels[0]); 

string ToLowerCase(string text) 
{ 
    for (int i = 0; i < text.length(); i++) 
    { 
     char c = text[i]; 
     if ((c >= 65) && (c <= 90)) 
     { 
      text[i] |= 0x20; 
     } 
    } 
    return text; 
} 


int main() 
{ 
    cin >> cad1; 
    for (int i = 0; cad1[i] != '\0'; i++) 
    { 

     for (int j = 0; j < size; j++) 
     { 
      if (cad1[i] == vowels[j]) 
      { 
       cad1.erase(cad1.begin() + i); 

      } 
     } 
     cad1[i] = tolower(cad1[i]); 
    } 

// for (int j = 0; cad1[j] != '\0'; j++) 
// { 
// } 

//  cad1 += "."; 
    for (int k = 0; cad1[k] != '\0'; k++) { 
      if (k % 2 == 0) { 
       cad1.insert(k, 1, '.');  
      } 
    } 

    cout << cad1 << endl; 
    cin.get(); 
} 

На самом деле цикл, который преобразует строку в нижний регистр также должен быть перемещен из внешнего для контура к. См. Новый отредактированный код.

Если вы предпочитаете, вы можете преобразовать в нижний регистр каждый символ, когда вы проходите их, ища гласные. См. Новый отредактированный код.

+0

сейчас другой проблема. этот код не стирает буквы «Y», «y» или «o». его странно, потому что для ввода: «Codeforces» он стирает «o». – user3152299

+0

Ошибка будет возникать, если есть 2 гласных вместе. Указатель перемещается после удаления первого гласного, оставляя второй гласный неповрежденным. Я обновлю код, чтобы устранить эту ошибку. – alvits

+0

Решение довольно простое. Измените 'cad1.erase (cad1.begin() + i);' декремент 'i'. Таким образом, после удаления указатель останется у нового символа. 'cad1.erase (cad1.begin() + i -);' – alvits

3

, что было раньше работал бы, но я думаю, что если включить std::string вы должны использовать свои функции. Попробуйте это:

#include <iostream> 
#include <string> 
#include <locale> 
using namespace std; 
// All of the vowels to remove 
const string vowels = "aeiouyAEIOUY"; // I don't know if you actually want y here 
// Takes a reference to the string you give it 
void remove_vowels(string &orig_str) { 
    // Iterate through the string, remove all of the characters in out vowels string 
    for (int i=0; i<orig_str.length(); ++i) { 
     orig_str.erase(remove(orig_str.begin(), orig_str.end(), vowels[i]), orig_str.end()); 
    } 
} 
// this function is pretty self explanatory 
void to_lower(string &orig_str) { 
    transform(orig_str.begin(), orig_str.end(), orig_str.begin(), ::tolower); 
} 
void put_dots(string &orig_str) { 
    // it is important to define max before you increase the length of the string 
    int max = orig_str.length(); 
    // iterate through the string, inserting dots 
    for (int i=0; i<max; ++i) { 
     orig_str.insert(i, string(".")); 
     // we want to increase i again because we added a character to the string 
     ++i; 
    } 
} 
int main(int argc, const char * argv[]) 
{ 
    string name = "BILLY\n"; 
    cout << name; 
    remove_vowels(name); 
    cout << name; 
    to_lower(name); 
    cout << name; 
    put_dots(name); 
    cout << name; 
    return 0; 
} 
+1

Хотя это обычно работает, использование ':: tolower' с вводом' char' может иметь UB, если 'char' не соответствует требованиям для параметра' :: tolower' (например, если он выходит за пределы диапазона of [[0, CHAR_MAX] '). Версия C++ можно найти в ''. –

+0

@ZacHowland Хорошо, спасибо за информацию. Кажется, я знаю, что случилось с другой моей программой. Я уточню свой ответ. – 735Tesla

0

Поскольку вы добавили это как C++, решение, которое использует алгоритмы из стандартной библиотеки:

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <limits> 
#include <locale> 
#include <sstream> 
#include <string> 

const std::string VOWELS = "AEIOUY"; // assume Y is always a vowel 

int main() 
{ 
    // read the input 
    std::string input; 
    while (!(std::cin >> input)) 
    { 
     std::cout << "Invalid input, try again\n"; 
     std::cin.clear(); 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 

    // erase vowels 
    input.erase(std::remove_if(input.begin(), input.end(), [&](char c) 
    { 
     std::locale loc; 
     c = std::toupper(c, loc); 
     return std::find(VOWELS.cbegin(), VOWELS.cend(), c) != VOWELS.cend(); 
    }), input.end()); 

    // transform to lowercase 
    std::transform(input.begin(), input.end(), input.begin(), [](char c) 
    { 
     std::locale loc; 
     return std::tolower(c, loc); 
    }); 

    // add . before every remaining letter 
    std::ostringstream oss; 
    std::for_each(input.begin(), input.end(), [&](char c) 
    { 
     std::locale loc; 
     if (std::isalpha(c, loc)) 
     { 
      oss << "."; 
     } 
     oss << c; 
    }); 

    input = oss.str(); 
    std::cout << "Resulting string: " << input << std::endl; 
    return 0; 
} 

Example

Смежные вопросы