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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Строки (массивы символов), замена одного символа в строке другим 
:(
    Опции темы
Scorpio
Дата 23.12.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 2.10.2006
Где: Россия, г. Санкт- Петербург

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



Такая вот проблема:

Есть какая-то последовательность символов. В ней нужно заменить символ '!' на символ '.'. Такую программу я написал:
Код
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main( void )
{
FILE *f;
int i,n;
char *s;
f=fopen("C:\\TC\\253_1.txt","wt");
if (f==NULL)
{
printf ("\n CYC!!!!");
return 0;
}
fputs("!!!dfghdfghdf!...!!.!.!.wefasedfsadfsd!",f);
fclose(f);
f=fopen("C:\\TC\\hz1.txt","rt");
printf("\n\n Vvedite n<=39 n= ");
scanf("%i",&n);
s=(char *)malloc(n * sizeof(char));
for (i=0;i<n;i++)
{
fscanf(f,"%c",&s[i]);
if (s[i]=='!')
{
s[i]='.';
}
printf("%c",s[i]);
}

fclose(f);
getch();
}


Но есть проблема: теперь мне нужно заменить все символы '.' в последовательности на символы '...'. Как мне это сделать?

Заранее благодарю!
PM MAIL   Вверх
Pete
Дата 23.12.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

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



Код

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
  FILE *f;
  int  *s;
  int   i, len;
  
  f = fopen( "qq.txt", "r+" );
  fseek( f, 0, SEEK_END );
  len = ftell( f ) - 1;
  fseek( f, 0, SEEK_SET );
  
  s = (int *) malloc( len*sizeof(int) );
  
  for (i = 0; i < len; i++) {
    s[i] = fgetc( f );
  }
  fseek( f, 0, SEEK_SET );
  for (i = 0; i < len; i++)
    if (s[i] == '.') {
      fprintf( f, "..." );
    } else {
      fputc( s[i], f );
    }
  
  fclose( f );
  
  return 0;
}



--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Rockie
Дата 23.12.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Scorpio, 
1) если С++ то std::string и find(), insert(), либо vector<char>
2) если не подходит то как вариант:

- считаем кол-во точек в массиве
- выделяем память для другого массива: 
  
Код
s=(char *)malloc( (n + 2*кол-во точек) * sizeof(char) );

- копируем в другой массив, добавляя точки
- указатели меняем местами, удаляем старый массив

Добавлено @ 18:28 
если тебе из одного файла в другой то просто читаешь посимвольно из одного и пишешь в другой, и при встрече точки пишешь ее трижды. блин, сбило название темы "Строки (Массивы символов), Замена одного символа в строке другим"




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Scorpio
Дата 24.12.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 2.10.2006
Где: Россия, г. Санкт- Петербург

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



Rockie, большое спасибо за алгоритм, но я немного его не понял. Ты ме мог бы привести примерный код программы?

P.S. Мне нужно не из файла в файл, а как ты написал в пункте 2), т.е. именно два массива.
PM MAIL   Вверх
Rockie
Дата 24.12.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Scorpio @  24.12.2006,  14:33 Найти цитируемый пост)
Rockie, большое спасибо за алгоритм, но я немного его не понял. Ты ме мог бы привести примерный код программы?

Копирование думаю сам сделаешь?
Код
#include <stdio.h>
#include <malloc.h>


int main()
{
    char* str = "text, text, so much text, :)";
    int len = 0, points = 0;             // длина исх строки и кол-во точек

    for(int i=0; str[i]!='\0';i++)       
      {
         len++;                           // считаем длину
         if(str[i]==',') points++;        // считаем точки
      }

/*  printf("%d\n",points);
    printf("%d",len);
*/

    // выделили память для массива и новых точек
    char* newStr = (char *)malloc( (len+1+points*2) * sizeof(char));

    for(int i=0;i<len;i++)
      {
          if(str[i]==',')
          { 
              // здесь реализуешь копирование нескольких точек в новый массив.
          }

         // здесь копируешь остальные эл-ты массива str в newStr, и в самом
         // конце добавляешь '\0'

      }

    return 0;
}






--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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