• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Проблема с заменой слов в строке

  • Автор темы 4xter
  • Дата начала
4

4xter

Нужно решить вот такую задачку: поменять местами первое и последнее слова в строке. Не могу понять где допустил ошибку. Вылетает во время работы с ошибкой. Делается всё в MS Visual C++
<!--shcode--><pre><code class='код'>#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <search.h>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <iostream.h>

#define STRLIMIT 200

class zamena
{
private: char *str,*newstroka;
public:
zamena();
~zamena();
unsigned char zag(int c);
unsigned char mal(int c);
int slovo1(char stroka[], int length);
int slovo2(char stroka[], int length);
unsigned char zam(char *str, int length);
void vivod();
};
unsigned char zamena::zag(int c) { // преобразование в заглавные буквы
if (c>='a' && c <= 'z') return (c-'g'+'G');
if (c>='а' && c <= 'я') return (c-'г'+'Г');
return c;
}
unsigned char zamena::mal(int c) { // преобразуем в маленькие буквы
if (c>='A' && c <= 'Z') return (c-'G'+'g');
if (c>='А' && c <= 'Я') return (c-'Г'+'г');
return c;
}

int zamena::slovo1(char stroka[], int length){ //нахожу конец первого слова
int q=0;
for (q=0;q<length;q++)
if (stroka[q]==' ') {break;}
return q;
}
int zamena::slovo2(char stroka[], int length){ //нахожу начало последнего слова
int w=0;
for (w=length; w>0; w--)
if (stroka[w]==' '){break;}
return w;
}
unsigned char zamena::zam(char *str, int length)
{
char buf[STRLIMIT]="", buf2[STRLIMIT]="", buf3[STRLIMIT]="", newstroka[STRLIMIT]="";
int na4;
//length=0; // сюда запишем длину строки
na4=slovo1(str,length);
for(int i=0; i<na4; i++) // записываем первое слово
buf = str;

int k=0;
int j=0;

int s2=slovo2(str,length)+1; // чтобы не потерять последний пробел


for(i=na4; i<s2; i++){ //записываем то что между первым и последним словами
buf2[k]=str;
k++;
}

if(str[length-1]=='.') length--; // проверка стоит ли вконце точка

for(i=s2; i<length; i++){ //записываем последнее слово
buf3[j]=str;
j++;
}
if(str[length]=='.') buf[strlen(buf)]='.'; // если была точка добавляем ее в конец предложения..

buf[0]=mal(buf[0]);
buf3[0]=zag(buf3[0]);

buf[strlen(buf)]='\0'; // дописываем нули окончания(на всякий случай)
buf2[strlen(buf2)]='\0';
buf3[strlen(buf3)]='\0';

sprintf(newstroka,"%s%s%s",buf3,buf2,buf); // соединяем все в одну строку

return 0;
}
void zamena::vivod()
{
cout<<newstroka;

//return 0;
}

zamena::zamena()
{

}
zamena::~zamena()
{
delete str;
delete newstroka;
}

;
int main(){
// объявляем переменные:
char stroka[STRLIMIT]="";//, //buf[STRLIMIT]="", buf2[STRLIMIT]="", buf3[STRLIMIT]="", newstroka[STRLIMIT]="";
int i,y;
int na4;
zamena predl;
char c; // будет считываемым символом
int leng=0;
char str[200];
printf("\nEnter phrase: ");
printf("\n");
gets(str);
//----------------------------------------------------
/* for( y=0; y<strlen(str); y++)
{

c = str[y]; //считываем символ

if(c!='\n') {stroka[leng++] = c;}

}*/


predl.zam(str,strlen(str));
predl.vivod();
return 0;
}[/CODE]
 
G

grigsoft

На вскидку - не нашел где выделяется память для newstroka. И еще:
Код:
buf[strlen(buf)]='\0';
Это вот весьма концептуальный код. strlen будет работать только если там уже стоит 0 в конце. Так что идея поставить 0 в конец на всякий случай - это, конечно, хорошо. Но длину строки в таком случае к этому моменту надо уже знать из других источников.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!