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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> С++,работа с char-строками., C++,версия компилятора 5.0.
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

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


Гость






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

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


Бывалый
***

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

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


Ну да в принципе..спасибо..НО всеравно это ошибки(?) не исправило..почему вылезают эти слова?МОжет там не очишается поток и они выходят со следующим вызовом cout..?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

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


Бывалый
***

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

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


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

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 28.03.2024 17:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name