IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> С++,работа с char-строками., C++,версия компилятора 5.0.
Andrewshkovskii
сообщение 18.10.2007 21:09
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Задание :
Задана запись,состоящая из букв.
Кол-во букв кратное числу N.
Всего в записи М слов.
Длина слова N.
Составить структурированную программу печати текста находяшегося между словами с заданными номерами A и B.

Проблема : даже не знаю как охарактеризовать..При выводе запроса на ввод следующего слова,вылезают слова,введенные ранее ,т.е :
Vvedite kol-vo slov v stroke:3

Vvedite kol-vo byks v slove (Kol-vo bykv doljo bit kratnoe chisly slov) :3

Vvedite 1 slovo iz 3 bykv:asd
sd 2 slovo iz 3 bykv:qwe
sd qwe 3 slovo iz 3 bykv:zxc

Nasha stroka : asd qwe zxc

Не могу понять в чем дело...

Вот код
#include <iostream>
#include <string.h>
#include <stdio.h>


int main ()
 {
  int m,n;
  cout << "Vvedite kol-vo slov v stroke:";
  cin >> m;
  cout << "\n";
  do
   {
    cout <<"Vvedite kol-vo byks v slove (Kol-vo bykv doljo bit kratnoe chisly slov:";
    cin >> n;
    cout <<"\n";
   }while ((m%n)!=0);

  char *str = new char[(m*n)-(n+1)];
  str="";
  char *word = new char[n];
  cin.get();
  for (int i=0;i<n;i++)
   {
    do
     {
        flush(cout);
        cout << "Vvedite " << i+1 << " slovo iz " << n << " bykv:";
        cin >> word;
        if ((strlen(word))>3)
         {
          cout << "\n Slovo doljno sostoyat iz " << n << " bykv!!!\n";
          cout << "Povtorite vvod!\n";
         }
     } while ((strlen(word))!=3);
    if (i==n-1)
    {
     strcat(str,word);
     }
    else
     {
      strcat(word," ");
      strcat(str,word);
     }
   }
   cout << "\nNasha stroka : " << str;

   cin.get();
   cin.get();
   }
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.10.2007 21:41
Сообщение #2


Гость






Эта программа у тебя работает? Мне выдает Segmentation Fault... Смотри:

if (i==n-1)
  {
    strcat(str,word);
  }
else
  {
    strcat(word," "); // <--- Вот тут проблема...
    strcat(str,word);
  }
При первом же проходе (i = 0, n = 3) ты пытаешься в word добавить еще символ, у тебя там есть уже 3 символа, при добавлении пробела ты просто вылетаешь за пределы выделенной памяти. Ошибка...
 К началу страницы 
+ Ответить 
Andrewshkovskii
сообщение 18.10.2007 21:47
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


for (int i=0;i<n;i++)
   {
    do
     {
        cout << "Vvedite " << i+1 << " slovo iz " << n << " bykv:";
        cin >> word;
        if ((strlen(word))>3)
         {
          cout << "\n Slovo doljno sostoyat iz " << n << " bykv!!!\n";
          cout << "Povtorite vvod!\n";
         }
     } while ((strlen(word))!=3);
     strcat(str," ");
     strcat(str,word);
   }
   cout << "\nNasha stroka : " << str;


Исправил..результат остался темже...Или я не так исправил?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.10.2007 21:54
Сообщение #4


Гость






smile.gif
  char *str = new char[(m*n)-(n+1)];
Почему "минус"? Тебе надо M*N символов, (M - 1) пробелов между ними и один символ для завершающего нуля... Я бы написал:
  char *str = new char[m*n + m];

 К началу страницы 
+ Ответить 
Andrewshkovskii
сообщение 18.10.2007 22:00
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Ну да в принципе..спасибо..НО всеравно это ошибки(?) не исправило..почему вылезают эти слова?МОжет там не очишается поток и они выходят со следующим вызовом cout..?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.10.2007 22:05
Сообщение #6


Гость






Не знаю, у меня ничего не вылезает... Только то, что и должно быть.

Цитата(Console)
Vvedite kol-vo slov v stroke:3

Vvedite kol-vo byks v slove (Kol-vo bykv doljo bit kratnoe chisly slov:3

Vvedite 1 slovo iz 3 bykv:asdf

Slovo doljno sostoyat iz 3 bykv!!!
Povtorite vvod!
Vvedite 1 slovo iz 3 bykv:asd
Vvedite 2 slovo iz 3 bykv:wert

Slovo doljno sostoyat iz 3 bykv!!!
Povtorite vvod!
Vvedite 2 slovo iz 3 bykv:wer
Vvedite 3 slovo iz 3 bykv:were

Slovo doljno sostoyat iz 3 bykv!!!
Povtorite vvod!
Vvedite 3 slovo iz 3 bykv:rew

Nasha stroka : asd wer rew

 К началу страницы 
+ Ответить 
Andrewshkovskii
сообщение 18.10.2007 22:09
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


очень странно..пробывал 2 компилятора(5.0 и 3.1) и через DevC++..в DEV вообще общибку выдает при вводе слова,то что память не может быть записана...о_О
Кстате,не мог ли Ты,Volvo,подталкнуть к мысле,как мне распечатать слова,между заданными пробелами?smile.gif

Сообщение отредактировано: Andrewshkovskii - 18.10.2007 22:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.10.2007 22:54
Сообщение #8


Гость






Цитата
как мне распечатать слова,между заданными пробелами?
Я вот так только что проверил в Builder-е:
...
	cout << "\nNasha stroka : " << str;

	int A, B, count = 0;
	cout << endl << "first space #: "; cin >> A;
	cout << endl << "second space #:"; cin >> B;

	char *p;
	for(p = str; *p; ++p) {
		if(*p == 32) {
		  if (++count == A) break;
		}
	}
	while(*(++p) && count < B) {
		cout << *p;
		count += (*p == 32);
	}

Все работает...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 9.10.2025 1:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"