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

Тема в разделе "MS Visual C++", создана пользователем 4xter, 12 дек 2009.

  1. 4xter

    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]
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    На вскидку - не нашел где выделяется память для newstroka. И еще:
    Код (Text):
    buf[strlen(buf)]='\0';
    Это вот весьма концептуальный код. strlen будет работать только если там уже стоит 0 в конце. Так что идея поставить 0 в конец на всякий случай - это, конечно, хорошо. Но длину строки в таком случае к этому моменту надо уже знать из других источников.
     
Загрузка...
Похожие Темы - Проблема заменой слов
  1. AgniXRudra
    Ответов:
    1
    Просмотров:
    10
  2. Zloikaktus
    Ответов:
    0
    Просмотров:
    14
  3. c0de3r
    Ответов:
    5
    Просмотров:
    134
  4. DobermannTT
    Ответов:
    10
    Просмотров:
    140
  5. SoulPaladin
    Ответов:
    4
    Просмотров:
    136

Поделиться этой страницей