Быстрый вопрос от новичка ie об удалении не-Upper-alpha: почему мой код не работает? - PullRequest
0 голосов
/ 06 мая 2020

Привет, я пытаюсь удалить весь алфавит без заглавной буквы из строкового ввода, но я не совсем уверен, где ошибка в моей кодировке. Прокомментируйте, если знаете почему!

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

string CreateAcronym(string userPhrase) {
int i;
int stringSize;
char charAti;

stringSize = userPhrase.size();

for (i=0 ; i < stringSize ; i++ ) {
   charAti = userPhrase.at(i);
   if ( !isupper(charAti)) {
      userPhrase.erase(i,1);
   }
}
return userPhrase;
}

int main() {
string userSentence;

getline(cin , userSentence);

cout << CreateAcronym(userSentence) << endl;

return 0;
}

Ответы [ 3 ]

1 голос
/ 06 мая 2020
  • Вы кэшировали старую длину строки и продолжали использовать, пока строка станет короче из-за стирания символов.
  • Вы пропускаете символы после символов для стирания, потому что i++ не отменяется после стирания.
stringSize = userPhrase.size();

for (i=0 ; i < stringSize ; i++ ) {
   charAti = userPhrase.at(i);
   if ( !isupper(charAti)) {
      userPhrase.erase(i,1);
   }
}

должно быть

for (i=0 ; i < static_cast<int>(userPhrase.size()) ; ) {
   charAti = userPhrase.at(i);
   if ( isupper(charAti)) {
      i++;
   } else {
      userPhrase.erase(i,1);
   }
}
0 голосов
/ 06 мая 2020

На проблему ответили другие, поэтому я просто добавляю свое «более простое» решение проблемы:

string CreateAcronym(string userPhrase) {
    string result;  // Create an empty string

    // Loop over all the characters in the original string
    for (char c : userPhrase) {
        // If the character is upper-case...
        if (isupper(c))
            result += c;  // Append it to the new string
    }

    return result;  // Return the new string
}
0 голосов
/ 06 мая 2020

У вас 2 проблемы в вашем коде.

Сначала вы стираете строку внутри l oop (что меняет ее длину), но при сравнении использует предварительно вычисленную длину.

Во-вторых, вам нужно увеличивать i только в том случае, если вы не стираете символ. В противном случае вы пропустите некоторые символы.

Рабочий l oop будет:

for (i = 0; i < userPhrase.size();) {
   charAti = userPhrase.at(i);
   if ( !isupper(charAti)) {
      userPhrase.erase(i,1);
   }
   else {
     ++i;
   }
}

Вы можете упростить этот l oop с помощью алгоритма:

string CreateAcronym(string userPhrase) {

 userPhrase.erase(std::remove_if(userPhrase.begin(), 
                    userPhrase.end(), [](auto charAti) { 
                      return !isupper(charAti); }), 
                  userPhrase.end());

 return userPhrase;
}

Вот демонстрация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...