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

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

Восстановить пароль Регистрация
 
blinds
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
05.02.2011, 22:55     Ввод и обработка строк. #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
#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++
Ввод/вывод и обработка изображения C++
C++ Ввод строк
Ввод текста на С, его обработка. C++
C++ Корректный ввод структуры и ее обработка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.02.2011, 14:19     Ввод и обработка строк. #4
blinds, Посимвольно быть может.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
06.02.2011, 15:11     Ввод и обработка строк. #5
Цитата Сообщение от blinds Посмотреть сообщение
Каким образом можно работать со строкой, в которой слова разделены последовательностью из символов '\0'? Просто если '\0' символ окончания, то все функции останавливаются при первой встрече с '\0'.
Каким образом определить окончание такой хитрой строки?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.02.2011, 15:23     Ввод и обработка строк. #6
lemegeton, думаю, вариантов два - либо определить другой символ для конца строки (не очень надёжно, вдруг мы именно такой символ захотим хранить в строке), второй - жёстко задавать размеры строки, чтобы просматривать её до конца.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2011, 16:26     Ввод и обработка строк.
Еще ссылки по теме:

C++ Ввод нескольких строк или массив строк
C++ Ввод и обработка матрицы
Ввод строк C++

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

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

Текущее время: 11:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru