Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Строки (массивы символов)


Автор: Scorpio 23.12.2006, 17:16
Такая вот проблема:

Есть какая-то последовательность символов. В ней нужно заменить символ '!' на символ '.'. Такую программу я написал:
Код
#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();
}


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

Заранее благодарю!

Автор: Pete 23.12.2006, 17:46
Код

#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;
}

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

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

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

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


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

P.S. Мне нужно не из файла в файл, а как ты написал в пункте 2), т.е. именно два массива.

Автор: Rockie 24.12.2006, 16:50
Цитата(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;
}




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)