Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> двойные пробелы 
:(
    Опции темы
dron2010
Дата 11.12.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2011

Репутация: нет
Всего: нет



Условие:
Написать программу, которая бы в произвольной строке (не более 80 символов) удаляла двойные пробелы и определяла длину новой строки.

Код:
Код

#include <stdio.h>   /*стандартный заголовочный файл ввод/вывода*/
#include <conio.h>   /*консольный ввод-вывод, используемый в старых компиляторах*/
#include <string.h>   /*заголовочный файл содержащий функции для работы с нуль-термированными строками и различными функциями работы с памятью*/
main() 
{
  /*int-целый тип*/
 int i,j;
  /*char-символьный тип*/
 char *st;   /*При описании строки как указателя, в отличие от описания строки как символьного массива, не надо заботиться о том, чтобы длина введенного текста не превышала длину строки. Потому что происходит следующее: вводится строка с клавиатуры и как только нажимается клавиша ENTER, что является признаком окончания ввода, к введенной последовательности символов автоматически добавляется нулевой байт и вся эта конструкция записывается по адресу строки*/
 clrscr();   /*функция очистки экрана в С*/
printf("vvod stroki \n");  /**/
 gets(st);   /*функция обеспечивающая ввод строки*/

 for(i=0;i<=strlen(st);i++)   /*для каждого i пока i меньше длины строки st прибавлять по 1*/
 
if((st[i]==' ') && (st[i+1]==' ') ) /*это проверка на два идущих пробела*/
  {
    for(j=i;j<=strlen(st);j++)  
   
 st[j]=st[j+2]; 
   
 i=i-2; 
    }
printf("\n"); /*переход на новую строку*/
 puts(st);   /*функция обеспечивающая вывод строки*/
 printf("dlina = %d",strlen(st));   /*печать длины строки*/
getch();
}


что выполняет в данном случае этот цикл
{
for(j=i;j<=strlen(st);j++) 

st[j]=st[j+2]; 

i=i-2; 
}
заранее спасибо!
PM MAIL   Вверх
Данкинг
Дата 11.12.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Как что: если текущий символ (st[i]) - пробел и следующий символ (st[i+1]) тоже пробел, то к текущему символу (st[i]) добавляем символ, стоящий через один от него (st[i+2]).

А разве на C++ нет функции замены символов? Вроде как в Дельфи StringReplace?

Это сообщение отредактировал(а) Данкинг - 11.12.2011, 11:59


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dron2010
Дата 11.12.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2011

Репутация: нет
Всего: нет



Цитата(Данкинг @ 11.12.2011,  11:59)
Как что: если текущий символ (st[i]) - пробел и следующий символ (st[i+1]) тоже пробел, то к текущему символу (st[i]) добавляем символ, стоящий через один от него (st[i+2]).

А разве на C++ нет функции замены символов? Вроде как в Дельфи StringReplace?

это не Дельфи, а С++
PM MAIL   Вверх
volatile
Дата 11.12.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(dron2010 @  11.12.2011,  11:53 Найти цитируемый пост)
что выполняет в данном случае этот цикл
{
for(j=i;j<=strlen(st);j++) 
st[j]=st[j+2]; 


Этот цикл выполняет "Access violation"

st[j+2] <= здесь происходит выход за пределы массива.

PM MAIL   Вверх
mes
Дата 11.12.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(dron2010 @  11.12.2011,  11:01 Найти цитируемый пост)
это не Дельфи, а С++ 

 smile  на С++ недотягивает.. да и вобще компилится не будет втаком виде.. 

Цитата(Данкинг @  11.12.2011,  10:59 Найти цитируемый пост)
А разве на C++ нет функции замены символов? Вроде как в Дельфи StringReplace?

есть, но, насколько я понимаю, у тс задание такое smile





--------------------
PM MAIL WWW   Вверх
Данкинг
Дата 11.12.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(dron2010 @  11.12.2011,  13:01 Найти цитируемый пост)
это не Дельфи, а С++ 

Ты мой вопрос прочитай внимательно. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dron2010
Дата 11.12.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2011

Репутация: нет
Всего: нет



Цитата(Данкинг @ 11.12.2011,  13:07)
Цитата(dron2010 @  11.12.2011,  13:01 Найти цитируемый пост)
это не Дельфи, а С++ 

Ты мой вопрос прочитай внимательно. smile

мб) я пока в С++ плохо разбираюсь
PM MAIL   Вверх
fish9370
Дата 11.12.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(dron2010 @  11.12.2011,  11:53 Найти цитируемый пост)
char *st;   /*При описании строки как указателя, в отличие от описания строки как символьного массива, 
не надо заботиться о том, чтобы длина введенного текста не превышала длину строки. 
Потому что происходит следующее: вводится строка с клавиатуры и как только нажимается клавиша
 ENTER, что является признаком окончания ввода, к введенной последовательности символов
 автоматически добавляется нулевой байт и вся эта конструкция записывается по адресу строки*/


только есть один ньюансик (помимо того что это на половину чушь) - память сначала нужно выделять (malloc, calloc)


Цитата(dron2010 @  11.12.2011,  11:53 Найти цитируемый пост)
clrscr();   /*функция очистки экрана в С*/


- нестандартная функция

Цитата(dron2010 @  11.12.2011,  11:53 Найти цитируемый пост)
gets(st);   /*функция обеспечивающая ввод строки*/


- запрещенная, небезопасная функция (будет вычеркнута из стандарта)



Это сообщение отредактировал(а) fish9370 - 11.12.2011, 16:33


--------------------
undefined
PM MAIL WWW ICQ   Вверх
feodorv
Дата 16.12.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Что-то вроде:

Код

#include <stdio.h>

int CompressString( char *string )
{
  char c;
  char *in, *out;

  for( in = out = string; *in != '\0'; in++)
  {
    if( in[0] == ' ' && in[1] == ' ' ) 
      in++;
    else
      *out ++ = *in;
  }

  *out = '\0';
  return (int) (out - string);
}


int main()
{
  char buf[100];
  int iLen, cLen;

  strcpy( buf, "  many   bad spaces    ");
  iLen = strlen( buf);

  cLen = CompressString( buf );
  printf( "iLen = %d, cLen = %d, buf = \"%s\"\n", iLen, cLen, buf);
}


Правда, здесь скорее нужно использовать тип size_t для разницы указателей...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.