Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена пробелов String.h 
V
    Опции темы
Winterlord
Дата 15.3.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Добрый вечер, уважаемые программисты! Борланд С++ изучаю сравнительно не долго, соответственно и опыта пока что маловато;) Обращаюсь к вам за помощью, хотелось бы, чтоб вы подкинули идейку, надоумили на решение.

Задача такая: Преобразовать заданную строку следующим образом: заменить все внутренние группы пробелов одним пробелом.

Всё это делается при помощи функций библиотеки string.h. С файла в массив фиксированной длины считывается строка с символами, все действия с элементами массива проводятся через указатели.

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

Код

#include <iostream.h>
#include <fstream.h>
#include <string.h>

fstream F,P;

//char strchr(char*p, char Q);

void main ()
{
int v;
int i=0;
int N=5;
char M[50];
char *p;
char S,Q;
p=&M[0];

F.open("input2.txt", ios::in);
P.open("output2.txt", ios::out);
 F.unsetf(ios::skipws);
 while (!F.eof())
  {
  F>>S;
  *(p+i)=S;
  P<<*(p+i);
  cout<<*(p+i);
  i++;
  }
 }

Ещё непонятно почему последний символ повторяется 2 раза.
Заранее премного благодарен!

Это сообщение отредактировал(а) Winterlord - 16.3.2009, 02:43
PM MAIL ICQ   Вверх
Anikmar
Дата 16.3.2009, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



ПОЛЬЗУЙТЕСЬ ПОИСКОМ.
Тема 100 раз обсуждалась.
Вариант:
Я не смотрел ваш код - только изменил имена файлов в древнем своем коде
Код

void DeleteSpaces(void)
{
    FILE *InputFile, *OutputFile;
    char Symbol;
    int Ret;
    bool FlagSpace = false;

    InputFile = fopen("input2.txt","r");
    OutputFile = fopen("output2.txt","w+");

    while(true)
    {
        Ret = fgetc(InputFile);
        if (Ret == EOF) break;
        Symbol = (char)Ret;
        if (Symbol == ' ')
            if (FlagSpace) continue;
            else FlagSpace = true;
        else FlagSpace = false;
        fputc(Symbol,OutputFile);
    }

    fclose(InputFile);
    fclose(OutputFile);
}



Кажется работает.

Это сообщение отредактировал(а) Anikmar - 16.3.2009, 03:11
PM MAIL ICQ   Вверх
afanp
Дата 16.3.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 25.11.2008

Репутация: нет
Всего: нет



посчитать число пробелов, потом их удалить, и добавить один большой пробел в конец?
и эта, считывай в строку из файла с помощью getline в стринг. 
Код

#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
ifstream infile;
    infile.open("test123.txt");
    if(!infile){
        cout << "file doesnt exist or cannot be opened\n";}
    else{
        string workstring;
    while(!infile.eof()){
        getline(infile,workstring);
        int k=0;
        for(int i=0;i<workstring.length();i++){
            if(workstring[i]==' ') k++;
        }
        cout << k << endl;
        workstring.erase(workstring.end(),remove(workstring.begin(),workstring.end(),' '));
        cout << workstring << endl;}
    }
    system("pause");
    return 0;
}

ну и там добавляешь потом куда надо  пробелы или еще че, если надо вставить все пробелы на место первого, то удаляешь все кроме первого 
а можно просто запомнить место первого пробела и потом туда еще инсертом все засунуть )

Добавлено через 14 минут
Anikmar, я в твоем коде ни шиша не понял  smile  могешь пояснить ? ты там просто пробелы считаешь ? 

Это сообщение отредактировал(а) afanp - 16.3.2009, 21:47
PM MAIL   Вверх
Anikmar
Дата 16.3.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(afanp @  16.3.2009,  21:36 Найти цитируемый пост)
Anikmar, я в твоем коде ни шиша не понял    могешь пояснить ? ты там просто пробелы считаешь ? 

Зачем их считать? Задача была оставить максимум по 1 пробелу - вот я и оставляю. Про количество ничего не было сказано:
Цитата(Winterlord @  15.3.2009,  23:56 Найти цитируемый пост)
Задача такая: Преобразовать заданную строку следующим образом: заменить все внутренние группы пробелов одним пробелом.


Просто такую задачу я уже кому-то помогал делать - вот и остался исходник.

А что, он не работает? Вроде как работал.

PM MAIL ICQ   Вверх
goody
Дата 16.3.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



Вот еще вариант :

Код

#include <iostream>
#include <cstring>

using namespace std;

int fyn (char *s) 
{
    char s2[250]="0";
    int i,j;
    int c=0;
    
    for (i=0; i < strlen(s); i++)
    {
        if(s[i]!=' ' || s[i-1]!=' ')
        {
            s2[c]=s[i];
            c++;
            
        }            
    }
    s2[strlen(s2)]='\0';
    strcpy(s,s2);
    return 0;
}



int main()
{
    char str[250];
    printf("before: ");
    gets(str);
    fyn(str);
    printf("after: ");
    puts(str);
    return 0;
} 



PM MAIL   Вверх
Anikmar
Дата 16.3.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(goody @  16.3.2009,  22:19 Найти цитируемый пост)
s2[strlen(s2)]='\0';

Можно узнать назначение этой строчки?
PM MAIL ICQ   Вверх
mes
Дата 16.3.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(goody @  16.3.2009,  21:19 Найти цитируемый пост)
Вот еще вариант :

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

Код

 void fyn (char *s)
{
    bool flag = false;
    char *p=s;

    for (;*s && *s==' '; ++s); // пропуск начальных пробелов

    for (;*s; ++s)
      if (*s!=' ')
      {
         if (flag) *p++= ' ';  // перенос пробела

          *p++=*s;           // перенос символа
          flag=false;
       }
       else flag=true;

      *p='\0';


P.S. А также без конца не гонятся функция strlen() - которая не просто возвращает размер, а при каждом вызове его считает перебором всех символов.  smile



Это сообщение отредактировал(а) mes - 16.3.2009, 22:56


--------------------
PM MAIL WWW   Вверх
Winterlord
Дата 16.3.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Немного поясню задание: 

На входе: "      The    project     of     the         International     Phonematic      Alphabet         "

На выходе: "      The project of the International Phonematic Alphabet         "
тоесть должны заменяться  только внутренние пробелы на один, а те пробелы, которые находятся перед текстом и за текстом, должны оставаться неизменными. И всё это должно быть реализовано с использованием функций из библиотеки string.h. Обращаться к элементам массива можно только через указатели. Вот и не знаю как сделать=\ 

Предполагаю, что нужно завести дополнительный массив, искать в  первом массиве первый пробел (кроме тех, что перед текстом <-- тоже не совсем понятно как пропустить), далее копировать с исправлениями кусок во второй массив и так далее. В итоге во втором массиве образуется исправленный текст. 

P.S. Большое спасибо всем откликнувшимся

Это сообщение отредактировал(а) Winterlord - 16.3.2009, 23:10
PM MAIL ICQ   Вверх
Anikmar
Дата 16.3.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Если брать конкретно мой пример - модифицируйте его - считывайте сразу строку, а затем формируйте результирующую строку и сохраняйте в другой файл.

Добавлено через 14 минут и 40 секунд
Вот с использованием string
Код

void DeleteSpaces(void)
{
    const int SizeOfBuff = 255;
    string str_in, str_out;
    FILE *InputFile, *OutputFile;
    char Symbol;
    int Ret;
    bool FlagSpace = false;
    char Buff[SizeOfBuff+1] = {0};

    InputFile = fopen("input2.txt","r");
    OutputFile = fopen("output2.txt","w+");

    while(!feof(InputFile))
    {
        fgets(Buff,SizeOfBuff,InputFile);
        str_in = Buff;
        str_out.clear();
        for(int j=0;j<str_in.length();j++)
        {
            Symbol = (char)str_in[j];
            if (Symbol == ' ')
                if (FlagSpace) continue;
                else FlagSpace = true;
            else FlagSpace = false;
            str_out.push_back(Symbol);
        }
        fputs(str_out.c_str(),OutputFile);
    }

    fclose(InputFile);
    fclose(OutputFile);
}


PM MAIL ICQ   Вверх
mes
Дата 16.3.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Winterlord @  16.3.2009,  22:04 Найти цитируемый пост)
И всё это должно быть реализовано с использованием функций из библиотеки string.h. Обращаться к элементам массива можно только через указатели.

имеется ввиду эта библиотека http://cplusplus.com/reference/string/string/ ?
Если да, то функции find...of() и substr() Вам в помощь.
Только вот не пойму к чему тут указатели. Не спутали ли воедино два разных задания ?!


--------------------
PM MAIL WWW   Вверх
Winterlord
Дата 17.3.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Цитата(mes @  16.3.2009,  23:52 Найти цитируемый пост)
имеется ввиду эта библиотека http://cplusplus.com/reference/string/string/ ?
Если да, то функции find...of() и substr() Вам в помощь.
Только вот не пойму к чему тут указатели. Не спутали ли воедино два разных задания ?! 

Нет, скорее функции вот этой библиотеки: (хотя работаю я в Борланде С++е)
http://forum.vingrad.ru/forum/topic-165963...1%82%D0%BC.html
И использовать, например, для поиска я хотел strchr()
А указатели, думаю, чтоб работать не напрямую со считанным из файла массивом и чтобы к строке через них обращаться, а не посимвольно.

Это сообщение отредактировал(а) Winterlord - 17.3.2009, 00:07
PM MAIL ICQ   Вверх
Anikmar
Дата 17.3.2009, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Winterlord @  17.3.2009,  00:03 Найти цитируемый пост)
И использовать, например, для поиска я хотел strchr()

Что вы там собрались искать? Пробелы что-ли?  smile 

Цитата(Winterlord @  17.3.2009,  00:03 Найти цитируемый пост)
А указатели, думаю, чтоб работать не напрямую со считанным из файла массивом. Может быть, чтобы к строке не посимвольно обращаться, а через указатели.

Строка - это массив символов. Какие еще дополнительные указатели нужны? Использовать их вместо операции индексирования []? Так это ради Бога.
PM MAIL ICQ   Вверх
Winterlord
Дата 17.3.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Цитата(Anikmar @  17.3.2009,  00:09 Найти цитируемый пост)
Что вы там собрались искать? Пробелы что-ли?  

Ну да) я ж писал
Цитата(Winterlord @  16.3.2009,  23:04 Найти цитируемый пост)
Предполагаю, что нужно завести дополнительный массив, искать в  первом массиве первый пробел (кроме тех, что перед текстом <-- тоже не совсем понятно как пропустить), далее копировать с исправлениями кусок во второй массив и так далее. В итоге во втором массиве образуется исправленный текст. 



Цитата(Anikmar @  17.3.2009,  00:09 Найти цитируемый пост)
Строка - это массив символов. Какие еще дополнительные указатели нужны? Использовать их вместо операции индексирования []? Так это ради Бога. 

Да, наверно так)
PM MAIL ICQ   Вверх
Anikmar
Дата 17.3.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Мой алгоритм такой:
Идем посимвольно по строчке. Встретили пробел - проверяем флаг. Если флаг установлен - значит пробел не первый, пропускаем. Если флаг не установлен - пробел первый - записываем в результирующую строку. Если символ вообще не пробел - флаг сбрасываем, символ записываем.

Никаких поисков в этой задаче не нужно. Каждый поиск - это пробег с начала строки. Зачем?
PM MAIL ICQ   Вверх
Winterlord
Дата 17.3.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Цитата(Anikmar @  17.3.2009,  00:22 Найти цитируемый пост)
Мой алгоритм такой:
Идем посимвольно по строчке. Встретили пробел - проверяем флаг. Если флаг установлен - значит пробел не первый, пропускаем. Если флаг не установлен - пробел первый - записываем в результирующую строку. Если символ вообще не пробел - флаг сбрасываем, символ записываем.

А ваш алгоритм игнорирует пробелы перед текстом и после?

PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.