Я написал код на C ++, чтобы убрать пробелы в предложении, но когда я пытаюсь его напечатать, он не будет печататься после первого слова - PullRequest
1 голос
/ 19 ноября 2010
# include <iostream>
# include <ctime>

using namespace std;

int stripWhite(char *str);

int main ()
{

 char str[50];
 cout << "Enter a sentence . " << endl;
 cin >>str;
 cout << "Your sentence without spaces is : " << endl;
 cout << (str) << endl; // This is my problem. The sentence only prints the first word

 stripWhite(str);
 cout << "There were " << stripWhite(str) << " spaces." << endl;
 return 0;
}
int stripWhite(char *str)
{
 char *p = str;
 int count = 0;
 while (*p)
 {
  if (*p != ' ')
   count++;
  {
   *p++;
  }
 }
 return count;

Ответы [ 4 ]

1 голос
/ 19 ноября 2010

Если вы не хотите заменять свою функцию строковым типом C ++, вы можете использовать cin.getline для получения строки ac (массив символов)

cin.getline(str, 50);
1 голос
/ 19 ноября 2010

std::cin обрабатывает пробелы как индикаторы конца строки.

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

# include <iostream>
# include <string>

using namespace std;

int stripWhite(string str); //change the formal parameter's type

int main ()
{

 string str;
 cout << "Enter a sentence . " << endl;
 getline(cin, str,'\n'); //use getline to read everything that has been entered till the press of enter
 cout << "Your sentence without spaces is : " << endl;
 cout << (str) << endl; // This is my problem. The sentence only prints the first word

 stripWhite(str);
 cout << "There were " << stripWhite(str) << " spaces." << endl;
 system("pause");
 return 0;
}

int stripWhite(string str)
{

 int count = 0;
 char* p = str.c_str;
 while (*p)
 {
  if (*p != ' ')
   count++;
  {
   *p++;
  }
 }
 return count;
}   
0 голосов
/ 19 ноября 2010

Вот Алгоритмы ускорения строк и, в частности, процедуры замены / удаления .

# include <iostream>
# include <string>

size_t stripWhiteSpaces(std::string& str)
{
  size_t const originalSize = str.size();
  boost::erase_all(str, ' ');
  return originalSize - str.size();
}

int main ()
{

  std::string str;
  std::cout << "Enter a sentence . \n";
  getline(std::cin, str);

  size_t const removed = stripWhiteSpaces(str);
  std::cout << "Your sentence without spaces is :\n";
  std::cout << (str) << '\n';

  std::cout << "There were " << removed << " spaces.\n";
  system("pause");
}
0 голосов
/ 19 ноября 2010

Как отмечают другие, вы должны использовать std::getline вместо cin >> str.

Однако в приведенном вами коде есть несколько других проблем.

  • Почемуиспользовать массив символов, когда вы можете использовать std::string?Почему вы так уверены, что 50 символов будет достаточно?
  • Ваша stripWhite функция, похоже, ничего не удаляет: вы подсчитываете количество непробельных символов, но фактически ничего не удаляете.Обратите внимание, что если вы переключитесь на std::string вместо обычных массивов символов, вы можете использовать стандартный алгоритм для выполнения этой работы (я думаю, что на вершине моей головы std::remove будет уместно)
  • Если предположить, что stripWhite действительно действительно изменил входную строку, зачем вам дважды вызывать ее из основного?Если целью является удаление строки в первую очередь, и , то выведите количество удаленных пробелов, заставьте stripWhite вернуть количество удаленных пробелов и сохранить этот результат в главном.

Например:

const int nbSpacesStripped = stripWhite(str);
cout << "There were " << nbSpacesStripped << "spaces." << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...