Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
blinds
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
#1

Ввод и обработка строк. - C++

05.02.2011, 22:55. Просмотров 656. Ответов 6
Метки нет (Все метки)

Доброго всем времени суток, собственно как и многие, начал проходить с++. Задачки которые есть простенькие, но одна вещь вводит меня в ступор. Я практически ничего не знаю в си, поэтому не знаю даже, что в гугле написать. Сидел полдня, так и не понял, что это.
Собственно, задача заключается в удалении из строки всех пробелов кроме одного. С этим особых проблем нету, но столкнулся с тем, что си не во всяком виде принимает строки с пробелами.
В общем, сейчас программа считает и удаляет все пробелы, которые есть в строке. Но, самое важное, что программа иногда выдает не правильный результат. Если быть точнее, она в новую строку, которая должна быть без пробелов, добавляет несуществующие символы.
Вот код:
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
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
main() {
clrscr;
char s1[61],s2[61];
int g,q,pr;
q=0;
cout << "enter symbols!\n";
cin.getline(s1,61);
cout << s1 <<"||" <<strlen(s1) <<"\n";
for (g=0;g<=(strlen(s1)-1);g++) {
if (s1[g]==' ') {pr++;}
}
cout << "pr = " << pr << "\n"; // количество пробелов
 
for (g=0;g<=(strlen(s1)-1);g++) {
if (s1[g]!=' ') {
 s2[q]=s1[g];
 q++;
 }
}
cout << s2 <<"\n";
cout << s2 <<"||" <<strlen(s2) <<"\n";
getchar();
}
Я сам не знаю, что это. У меня ли ошибка, или я чем-то неправильно пользуюсь, или баг. Буду благодарен за помощь.
Миниатюры
Ввод и обработка строк.   Ввод и обработка строк.  
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2011, 22:55     Ввод и обработка строк.
Посмотрите здесь:

Ввод чисел и обработка. - C++
доброго времени суток всем! не успел ещё разобраться с с++, а домашки уже накопил несданной... вобщем такая вот задача имеется 1 с...

Ввод и обработка матрицы - C++
В общем, завалили меня на экзамене за то, что от моей флешки вирусами заразился комп моего препода. Но суть не в этом. У меня имеются...

Ввод/вывод и обработка изображения - C++
Доброго времени суток. Помогите, пожалуйста. Поставили задачу взять 2 кадра (2 изображения формата BMP или JPG) и вычесть одно из...

Ввод текста на С, его обработка. - C++
Задан текст, содержащий произвольное количество строк, в которых отдельные слова могут разделяться одним или несколькими пробелами и...

Как происходит ввод и обработка символов из консоли? - C++
Приветствую, не могли бы вы мне подсказать на счет одной вещи. В книге Страуструпа есть реализация калькулятора, которая основана на том,...

Ввод, хранение и обработка информации для учета продажи товаров - C++
Всем привет, вот задали задание. Реализовать программное приложение, позволяющее вводить, хранить и обрабатывать информацию для учета...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
06.02.2011, 00:34     Ввод и обработка строк. #2
А какой пробел вы оставляете? Не вижу в результатах пробелов. Подсчет еще пробелов имеется...

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
#include <cstring>
#include <cstdlib>
#include <cstddef>
#include <cstdio>
 
int RemoveSpaces(char *string) {
  char *destination_string = new char[strlen(string) + 1];
 
  char *source_symbol = string;
  char *destination_symbol = destination_string;
  size_t space_count = 0;
 
  while (*source_symbol != '\0')
    if (*source_symbol != ' ') {
      *(destination_symbol++) = *(source_symbol++);
    } else {
      ++source_symbol;
      ++space_count;
    }
  *destination_symbol = '\0';
 
  strcpy(string, destination_string);
  delete [] destination_string;
 
  return space_count;
}
 
int main(int argc, char **argv) {
  const size_t k_buffer_size = 2048;
  char buffer[k_buffer_size];
 
  printf("Enter a line:\n");
  fgets(buffer, k_buffer_size, stdin);
  buffer[strlen(buffer) - 1] = '\0';
 
  char *string = strcpy(new char[strlen(buffer) + 1], buffer);
  size_t space_count = RemoveSpaces(string);
  printf("String: '%s', saces removed: %d.\n", string, space_count);
 
  delete [] string;
  return 0;
}
blinds
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
06.02.2011, 14:17  [ТС]     Ввод и обработка строк. #3
На этапе создания топика, я еще не прикрутил.) Я уже написал так, что остается последний пробел, который есть в строке. Текст, конечно, не такой красивый, но все же добился своего. У меня проблемка в другом была, появлялись в "новой" (которая только с одним пробелом) строке лишние символы, правда я не догадался вручную записать вконец символ окончания строки. Сейчас все уже сделал, но, в любом случае, спасибо за внимание и труд для меня.

Добавлено через 12 часов 40 минут
Ап.
Я тут еще с одним вопросом. Каким образом можно работать со строкой, в которой слова разделены последовательностью из символов '\0'? Просто если '\0' символ окончания, то все функции останавливаются при первой встрече с '\0'.
Мне надо взять такую строку и создать новую, с обратным порядком "слов".
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
06.02.2011, 14:19     Ввод и обработка строк. #4
blinds, Посимвольно быть может.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
06.02.2011, 15:11     Ввод и обработка строк. #5
Цитата Сообщение от blinds Посмотреть сообщение
Каким образом можно работать со строкой, в которой слова разделены последовательностью из символов '\0'? Просто если '\0' символ окончания, то все функции останавливаются при первой встрече с '\0'.
Каким образом определить окончание такой хитрой строки?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
06.02.2011, 15:23     Ввод и обработка строк. #6
lemegeton, думаю, вариантов два - либо определить другой символ для конца строки (не очень надёжно, вдруг мы именно такой символ захотим хранить в строке), второй - жёстко задавать размеры строки, чтобы просматривать её до конца.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2011, 16:26     Ввод и обработка строк.
Еще ссылки по теме:

Ввод строк - C++
Функция не дает ввести строки и завершается сразу после её вызова. Как исправить? void Sum() { char str1; char str2; cout &lt;&lt;...

Ввод строк - C++
Доброго дня. Проблема такая: при вводе нескольких строк программа вылетает #include&lt;iostream&gt; using namespace std; int main() { ...

обработка строк. - C++
нужно составить программу. вот задание: даны n предложений. найти в каждом последнее слово и напечатать их в строку через пробел. язык Си....

Обработка строк - C++
Разработать алгоритм и программу для определения в тексте что самого длинного слова, в котором нет цифр. Нужна ваша помощь,...


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

Или воспользуйтесь поиском по форуму:
blinds
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
06.02.2011, 16:26  [ТС]     Ввод и обработка строк. #7
Цитата Сообщение от ForEveR Посмотреть сообщение
blinds, Посимвольно быть может.
Идеи на счет этого есть, но думал, может не я один такой и есть уже разработанные решения для таких задач.
Каким образом определить окончание такой хитрой строки?
Скорее всего строка будет жестко определена, т.к. я даже не знаю как ввести с той же клавиатуры знаки конца и собственно не закончить ввод.
второй - жёстко задавать размеры строки, чтобы просматривать её до конца.
Ну я думаю, что ничего страшного не будет, если я возьму конкретную строку и буду с ней работать.
В общем, пока мысли есть по поводу посимвольной обработки.
Yandex
Объявления
06.02.2011, 16:26     Ввод и обработка строк.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru