Помощь - Поиск - Пользователи - Календарь
Полная версия: С++,работа с char-строками.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Andrewshkovskii
Задание :
Задана запись,состоящая из букв.
Кол-во букв кратное числу 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();
}
volvo
Эта программа у тебя работает? Мне выдает Segmentation Fault... Смотри:

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


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

Andrewshkovskii
Ну да в принципе..спасибо..НО всеравно это ошибки(?) не исправило..почему вылезают эти слова?МОжет там не очишается поток и они выходят со следующим вызовом cout..?
volvo
Не знаю, у меня ничего не вылезает... Только то, что и должно быть.

Цитата(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
очень странно..пробывал 2 компилятора(5.0 и 3.1) и через DevC++..в DEV вообще общибку выдает при вводе слова,то что память не может быть записана...о_О
Кстате,не мог ли Ты,Volvo,подталкнуть к мысле,как мне распечатать слова,между заданными пробелами?smile.gif
volvo
Цитата
как мне распечатать слова,между заданными пробелами?
Я вот так только что проверил в 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);
}

Все работает...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.