Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6

Избыточный перенос на новую строку при отображении значения типа string

23.10.2016, 00:21. Показов 2810. Ответов 10

Студворк — интернет-сервис помощи студентам
Когда ввожу проиpвольное значение в терминал, к примеру: asdsad dfadf.
То программа выдает ответ:
Output:
asdsad dfadf.
Т.е оставляет один пробел передвведенной строкой и переносит ее на новую строку. считываю командой getline: getline(cin, s1, ‘$’);
Символ ‘$’- нуже чтобы можно было ввести не одну строку, а несколько, например целый абзац или несколько абзацев.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
string delOverSpace(string str){
 int i = 0;
 do{
  int countSpc = 0;
  char ch = str.at(i);
  cout << ch << endl;
  while(ch == ' '){
   countSpc++;
   i++;
   ch = str.at(i);
//   cout << ch << endl;
  }
  if ((i - countSpc) == 0) {
   if(countSpc >= 1) {
    str.erase((i - countSpc), i);
    i = i - countSpc;
   } else i++;
  } else {
   if(countSpc > 1) {
   str.erase((i - countSpc), countSpc - 1);
   i = i - countSpc;
  } else i++;
  }
 }while(i < str.length() - 1);
 
return str;
//  cout << "After erising \' \':" << str << endl;
}
Заранее спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2016, 00:21
Ответы с готовыми решениями:

При записи в файл в MFC не могу сделать пробел/перенос на новую строку
При записи в файл в MFC не могу сделать пробел/перенос на новую строку. То есть вот часть кода: CStdioFile...

Как скопировать строку типа std::string в другую строку такого же типа?
Хотел скопировать строку #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int _tmain(int...

Как узнать что при считывание очередного слова в string был сделан переход на новую строку в файле?
подскажите пожалуйста, как узнать что при считывание очередного слова в string был сделан переход на новую строку в файле?. ПС не...

10
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.10.2016, 00:48
Цитата Сообщение от Ainous Посмотреть сообщение
Код:
И о чём он?

Добавлено через 5 минут
Какое отношение он имеет к этому?
Цитата Сообщение от Ainous Посмотреть сообщение
Цитата Сообщение от Ainous Посмотреть сообщение
Когда ввожу проиpвольное значение в терминал, к примеру: asdsad dfadf.
То программа выдает ответ:
Output:
asdsad dfadf.
0
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6
23.10.2016, 00:57  [ТС]
Это функция удаления пробелов, скорее всего в ней ошибка. Весь код писать смысла нет, так как это только запрос строки, которая читается getline и передача ее в функцию
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.10.2016, 01:14
Цитата Сообщение от Ainous Посмотреть сообщение
Это функция удаления пробелов, скорее всего в ней ошибка. Весь код писать смысла нет, так как это только запрос строки, которая читается getline и передача ее в функцию
???
Цитата Сообщение от nd2 Посмотреть сообщение
Какое отношение он имеет к этому?
Цитата Сообщение от Ainous
Когда ввожу проиpвольное значение в терминал, к примеру: asdsad dfadf.
То программа выдает ответ:
Output:
asdsad dfadf.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.10.2016, 01:17
Что не так?
Миниатюры
Избыточный перенос на новую строку при отображении значения типа string  
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.10.2016, 01:26
Или так.
Миниатюры
Избыточный перенос на новую строку при отображении значения типа string  
0
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6
23.10.2016, 04:59  [ТС]
Спасибо за ответы, я не четко пояснил свою проблему ((
Суть функции в том, что она удаляет лишнии пробелы и если лишних нет, то и вопросов к ней нет, она ничего не удаляет.
Вот такой получается output, если задать производьный текст
Миниатюры
Избыточный перенос на новую строку при отображении значения типа string  
0
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6
23.10.2016, 05:26  [ТС]
Это дз и я не хотел полностью выкладывать код, так как расчитывал допилить прогу самостоятельно, если получится разобраться с удалением пробелов.
Но похоже, что проблема даже малость побольше, чем просто перенос строки, так как по заданию пользователь должен задать произвольный текст с произвольным числом слов и пробелов, каждое предложение оканчивается точкой и затем запросить у программы выдать колличество строк с интересующим его колличеством слов (например 3), однако в моем случа программа не только переносит текст на новыю строку и не удаляет первы пробел, но и выдает ошибочное колличество строк (на 1 больше того, что должно). Поэтому выкладываю весь код, может где-то в нем ошибка, а не в этой функции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <string>
using namespace std;
//////////////////////////////////////////////////////
string predString();
string delOverSpace(string);
int countWords(string, int);
/////////////////////////////////////////////////////
int main(){
 char ans = ' ';
 int num = 0;
 string s1; // = "We are going to a country house next weekends. There will be a few people there.";
 
 do{
  cout << "Would you like to enter text yourself? (y/n) "; cin >> ans;
  if (ans == 'n' || ans == 'N') {
   cout << "You chose to use predefined string.\n";
   s1 = predString();
   cout << s1 << endl;
  } else if (ans == 'y' || ans == 'Y') {
   cout << "Enter your string:"; getline(cin, s1, '$');
  } else cout << "Your answer have to consist of \'y\' or \'n\' characters." << endl;
  
  int numOfWords = 0;
  cout << "Lines with which amount of words you want to count: "; cin >> num;
  if (num <= 0) cout << "You have to choose number that is above 0" << endl;
  else {
   string s2 = delOverSpace(s1);
   numOfWords = countWords(s2, num);
   cout << "Number of lines with " << num << " words: " << numOfWords << endl;
  }
  cout << "Would you like to continue? (y/n) "; cin >> ans;
 }while(ans == 'y' || ans == 'Y');
 
return 0;
}
 
/*****************Predefined String Function**********************/
string predString(){
 string str = 
"\tPointers, References and Dynamic Memory Allocation are the most powerful features in C/C++ language, which allows programmers to directly manipulate memory to efficiently manage the memory - the most critical and scarce resource in computer - for best performance.  However, "pointer" is also the most complex and difficult feature in C/C++ language. \n\tPointers are extremely powerful because they allows you to access addresses and manipulate their contents. But they are also extremely complex to handle. Using them correctly, they could greatly improve the efficiency and performance. On the other hand, using them incorrectly could lead to many problems, from un-readable and un-maintainable codes, to infamous bugs such as memory leaks and buffer overflow, which may expose your system to hacking. Many new languages (such as Java and C#) remove pointer from their syntax to avoid the pitfalls of pointers, by providing automatic memory management.\n\tAlthough you can write C/C++ programs without using pointers, however, it is difficult not to mention pointer in teaching C/C++ language. Pointer is probably not meant for novices and dummies.";
 
return str;
}
/***************************************************************/
 
/***********Count Number of Words Function**********************/
int countWords(string str, int num){
// int count = 0;
 int lCount = 0;
 int i = 0;
 cout << "You entered:" << str /*<< str.length()*/ << endl;
 do{
  int wCount = 1;
  do{
   i++;
   if ((i < str.length()) && (str.at(i) == ' ')) wCount++;
  }while((i < str.length()) && (str.at(i) != '.'));
//  cout << wCount << endl;
  if (wCount >= num) lCount++;
 }while(i < str.length()); 
   
return lCount;
}
/**************************************************************/
 
/*******************Delete Excessive Spacing*********************/
string delOverSpace(string str){
 int i = 0;
 do{
  int countSpc = 0;
  char ch = str.at(i);
//  cout << ch << endl;
  while(ch == ' '){
   countSpc++;
   i++;
   ch = str.at(i);
//   cout << ch << endl;
  }
  if ((i - countSpc) == 0) {
   if(countSpc >= 1) {
    str.erase((i - countSpc), i);
    i = i - countSpc;
   } else i++;
  } else {
   if(countSpc > 1) {
   str.erase((i - countSpc), countSpc - 1);
   i = i - countSpc;
  } else i++;
  }
 }while(i < str.length() - 1);
 
return str; 
//  cout << "After erising \' \':" << str << endl;
}
/**************************************************************/
0
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6
23.10.2016, 05:30  [ТС]
Если задать текст с нормальным колличеством пробелов:
fhsdfkhsdk fhsdfhsfhskdfjh hfsahfsdhfkj fshdfhsfj.
fjdskhf fshdfjhsdfh fhsdjfhsj fjsdhfjhs jfsjdhfsj fhsjdfhsj jfsjhdfj.
fdsjfhsj hfjshdfjh.
и запросить программу выдать коллчество строк с 3 и более колличеством слов в них, то программа сработает верно и выдаст число 2.
Миниатюры
Избыточный перенос на новую строку при отображении значения типа string  
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.10.2016, 14:37
Лучший ответ Сообщение было отмечено Ainous как решение

Решение

После беглого просмотра твоего кода, лишний переход на новую строку понятен. Псле ввода cin >> ans;, в потоке ввода останется '\n', который getline() извлечёт первым. Если бы getline() читала, как обычно, до '\n', то здесь был бы просто пропуск ввода, но так как чтение должно быть до '$', то getline() добавит '\n' в строку и будет ожидать дальнейшего ввода. Исправить это можно так:
C++
1
(cin >> ans).get();
1
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 6
23.10.2016, 19:33  [ТС]
Спасибо, за ответ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2016, 19:33
Помогаю со студенческими работами здесь

Перевести строку типа string, в строку типа double
Помогите с кодом. Как строку типа стринг, например 123123.123123, перевести в тип double? Кода перевожу с помощью &quot;atof&quot; оно...

Очистка окна textarea и перенос строки при отображении
Всем привет! Помогите пожалуйста! Код, который вставлен ниже рабочий, но требует не большой модернизации! 1 - Мне нужно сделать так что...

Как совместить строку типа String, имеющуюся в коде и функцию, принимающую std::string ?
Доброго времен суток)) У меня такая проблема: есть строка типа String^ , а функция принимает string. Не знаю как их...

Запись значения типа String^ в char* или std::string
String^ D1=textBox1-&gt;Text; Int32 D2=Convert::ToInt32(textBox2-&gt;Text); //god Int32 D3=Convert::ToInt32(textBox3-&gt;Text); //dochod ...

Перенос на новую строку VS C++
Здравствуйте возник такой вопрос.я взял ячейку из таблицы и присвоил к ней переменную чтобы потом вывести в label. А так как текст ячейки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru