Мой код для удаления пустых пространств в предложении в C ++ имеет проблему - PullRequest
0 голосов
/ 30 сентября 2018

Я сделал этот код таким, чтобы все, что я печатаю в предложении, имело первую заглавную букву первого слова;Сокращая любое количество пробелов в предложении до одного пробела.Однако мои предложения сокращаются только на один пробел.Например, если я поместил в предложение 3 пробела, выходные данные будут уменьшены на 1-2 пробела, но я хочу, чтобы вывод слов в предложении содержал только один пробел.Я не могу понять, что не так с моим кодом, и поэтому любая помощь будет принята с благодарностью.Я приложил свой код для справки ниже:

#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    int i = 0;              //i for counter
    string str;
    //String variable

    getline(cin, str);      //Get string from user
    int L = str.length();   //Find length of string
        //Display original string

    for (int i = 0; i < 100; i++)
    {
        str[i] = tolower(str[i]);
    }

    str[0] = toupper(str[0]);

    bool space;

    for (int j = i + 1; j < L; j++)
    {
        str[j] = str[j + 1];
        L--;
    }
    cout << str << endl;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Или сделать это более современным способом, используя итераторы:

#include <iostream>
#include <cctype>

int main() {

  std::cout << "This is the string trimming function.\n" <<
  "Throw in a string and I will make sure all extra spaces " <<
  "will be reduced to single space.\n";

  std::string InputString, TrimmedString;
  int head = -1;
  int tail = -1;
  std::cout << "Please enter the input string :\n" << std::endl;
  std::getline(std::cin, InputString);

  for(std::string::iterator it = InputString.begin(); it <= InputString.end(); it++){
    if (*it != ' ' && head < 0 && tail < 0) {
      head = std::distance(InputString.begin(), it);
    }
    else if (head >= 0 && tail < 0 && (*it == ' ' || it == InputString.end())) {
      tail = std::distance(InputString.begin(), it);
      TrimmedString.append(InputString, head, (tail-head));
      TrimmedString.push_back(' ');
      head = -1;
      tail = -1;
    }
  }

  TrimmedString[0] = toupper(TrimmedString[0]);
  std::cout << "\nThe processed string is :\n\n" << TrimmedString << std::endl;
  return 0;
}
0 голосов
/ 30 сентября 2018

Попробуйте:

int main()
{
    std::string str;
    std::getline(cin, str);
    //Change case
    str[0] = toupper(str[0]);
    std::transform(str.begin() + 1, str.end(), str.begin() + 1, ptr_fun<int, int>(tolower));
    //Parsing time
    for (int i = 0; i <= str.size() - 1; i++) 
    {
        if (str[i] == ' ' && str[i + 1] == ' ') //if present & next are whitespaces, remove next
        {
                str.erase(str.begin() + i);
                i--; // rechecking condition
        }
    }
    std::cout << '\n' << str << '\n';
}

Вывод:

enter image description here

...