Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 3

Необходимо в файле удалить слова с двойными буквами

03.02.2022, 17:23. Показов 1156. Ответов 12

Студворк — интернет-сервис помощи студентам
Задание: В текстовом файле удалить все слова с двойными буквами (например: медленно, странный, программирование и т.п.).
Заранее большое спасибо
Пробовал сделать получилось только с одной стройкой, а как сделать со всеми строками ума не приложу

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <conio.h>
 
int main(void) 
{   
    FILE *fi;
    fi=fopen("text.txt","r+");
    
    char str[500]; 
    int i, count = 0, size; 
    char g = ' ';
    char* ptr; 
    
    for (i=0; i<500; i++) str[i]= ' ';
    fgets(str,sizeof(str),fi);
    ptr = strtok(str, " "); 
 
    while(ptr) 
    {  
        size = strlen(ptr); 
        for ( i = 0; i < size - 1; ++i) 
            if(ptr[i] == ptr[i+1]) 
            { 
                for (i = 0; i < size; ++i)
                {
                ptr[i] = g; 
                }
                break; 
            } 
            ptr = strtok(0, " "); 
    } 
    fclose(fi);
    FILE* fd = fopen("text.txt", "wb");
    for (int i = 0; i < 500; i++){
        fprintf(fi,"%c",str[i]);
    }
    fclose(fd);
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2022, 17:23
Ответы с готовыми решениями:

В тексте подсчитать повторяющиеся слова, удалить слова с удвоенными буквами
3.С клавиатуры вводится текстовую строку. Написать программу,которая подсчитывает количество разных слов,что входят до этого текста;выводит...

В каждой строке удалить те слова, в которых первые три буквы совпадают с начальными буквами последнего слова строки
Дан например файл (text.txt) . Этот файл нужно вызвать и удалить те слова, в которых первые три буквы совпадают с начальными буквами...

Удалить слова с повторяющимися буквами
Переведите на ассемблер, не понимаю это. Задание: Удалить слова с повторяющимися буквами. var s:string; i0,i1,j,k:integer; ...

12
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
03.02.2022, 18:03
Цитата Сообщение от kavails Посмотреть сообщение
а как сделать со всеми строками ума не приложу
Например читать и писать разные файлы, а потом просто переименовать.
0
Windows must die
672 / 850 / 103
Регистрация: 23.11.2021
Сообщений: 4,978
Записей в блоге: 16
03.02.2022, 18:17
Вообще-то, приведенный кусок кода не удаляет слова. Он заменяет пробелы нулями, а потом слова с двойными буквами заменяет пробелами. В общем, делает совсем не то, что требовалось!
Еще непонятна конструкция
C
1
2
for (int i = 0; i < 500; i++){
fprintf(fi,"%c",str[i]);
Я бы проще сделал: mmap'нуть оригинальный файл, далее посимвольно по полученной "строке" пробежаться: как только встретили isalpha, запомнили указатель на нее или предшествующий пробел (если был), это - начало слова. Если встретили повторяющуюся букву, установили флаг удаления. Как только появилась !isalpha, либо записываем слово в файл назначения, либо пропускаем (в зависимости от флага). Если пропускаем, то идем дальше. Все прочие символы напрямую пишем.
Для упрощения выходной файл тоже можно заmmap'ить.
0
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 3
03.02.2022, 18:37  [ТС]
Если честно в СИ совершенный новичок, даже не понял что вы написали, если есть время можете написать как нужно правильно сделать. Конечно сильно навязываюсь за это извиняюсь
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
03.02.2022, 19:47
Цитата Сообщение от kavails Посмотреть сообщение
даже не понял что вы написали
Открой 2 файла: один на запись, другой на чтение. Строчку читаешь, удаляешь слова, пишешь во второй файл. Повторять пока первый файл не закончится.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FILE* output = fopen(path_out, "w");
FILE* file = fopen(path_in, "r");
 
if(!file) return 0;
 
char buffer[512];
 
size_t i = 0;
while(fgets(buffer, 512, file)){
 
    // Обрабатывать строку здесь.
    // Строка - buffer
    
    fputs(buffer, output);
}
 
fclose(file);
fclose(output);
Добавлено через 2 минуты
Насчет переименования сложнее: под виндой не умею, в линуксе можно апи дергать
C
1
rename(old_path, new_path);
0
0 / 0 / 0
Регистрация: 03.02.2022
Сообщений: 3
03.02.2022, 20:54  [ТС]
Совершенно далек от этого
Где-то совершил ошибку ?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
int main()
{
FILE* output = fopen("path_out", "w");
FILE* file = fopen("path_in", "r");
 
if(!file) return 0;
 
int size;
char g = ' ';
char buffer[512];
char* ptr;
 
size_t i = 0;
while(fgets(buffer, 512, file)){
 
    ptr = strtok(buffer, " "); 
 
    while(ptr) 
    {  
        size = strlen(ptr); 
        for ( i = 0; i < size - 1; ++i) 
            if(ptr[i] == ptr[i+1]) 
            { 
                for (i = 0; i < size; ++i)
                {
                ptr[i] = g; 
                }
                break; 
            } 
            ptr = strtok(0, " "); 
    } 
    
    fputs(buffer, output);
}
 
fclose(file);
fclose(output);
}
0
Windows must die
672 / 850 / 103
Регистрация: 23.11.2021
Сообщений: 4,978
Записей в блоге: 16
03.02.2022, 21:50
kavails, ну зачем ты вместо того, чтобы удалять нужное слово, просто затираешь его пробелами?
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
03.02.2022, 22:34
Цитата Сообщение от kavails Посмотреть сообщение
Где-то совершил ошибку ?
1-3 строки: Библиотеки с++ подключены вместо сишных.
4 строка: в си нет неймспейсов, это приколы из с++.
7,8 строки: В линуксе, конечно, все - суть файл, но что-то раньше ты ставил еще и расширение .txt. Не забыл? так и надо?
37 строка: ты строку на токены разбиваешь парой строк выше. так что она выведется лишь частично если в ней есть хоть одно слово, которое надо удалить.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <string.h>
 
int main()
{
    FILE* output = fopen("path_out.txt", "w");
    FILE* file = fopen("path_in.txt", "r");
     
    if(!file) return 0;
     
    int size;
    char buffer[512];
    char* ptr;
     
    size_t i = 0;
    while(fgets(buffer, 512, file)){
 
        ptr = strtok(buffer, " ");
 
        while(ptr){
            size = strlen(ptr); 
            for (i = 0; i < size - 1; ++i) 
                if(ptr[i] == ptr[i+1]){
                    ptr = 0;
                    break;
                }
 
            if(ptr){
                fputs(ptr, output);
                fputc(' ', output);
            }
            
            ptr = strtok(0, " ");
        }
    }
     
    fclose(file);
    fclose(output);
}
Цитата Сообщение от kavails Посмотреть сообщение
Совершенно далек от этого
ты так думаешь? По-моему неплохо собрал программу из 2 кусков и в принипе ничего лишнего. Просто практики не хватает.
0
Windows must die
672 / 850 / 103
Регистрация: 23.11.2021
Сообщений: 4,978
Записей в блоге: 16
04.02.2022, 00:32
Цитата Сообщение от assemberist Посмотреть сообщение
расширение
Суффикс, вообще-то! Расширение — это исключительно термин DOS'а.
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
04.02.2022, 02:13
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Расширение — это исключительно термин DOS'а.
Который перекочевал в винду, на которой сидят 95%.
0
8 / 6 / 2
Регистрация: 29.03.2020
Сообщений: 57
04.02.2022, 12:48
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <string.h>
 
int main()
{
    FILE* output = fopen("path_out.txt", "w");
    FILE* file = fopen("path_in.txt", "r");
     
    if(!file) return 0;
     
    int size;
    char buffer[512];
    char* ptr;
     
    size_t i = 0;
    while(fgets(buffer, 512, file)){
 
        ptr = strtok(buffer, " ");
 
        while(ptr){
            size = strlen(ptr); 
            for (i = 0; i < size - 1; ++i) 
                if(ptr[i] == ptr[i+1]){
                    ptr = 0;
                    break;
                }
 
            if(ptr){
                fputs(ptr, output);
                fputc(' ', output);
            }
            
            ptr = strtok(0, " ");
        }
    }
     
    fclose(file);
    fclose(output);
}
Так он удаляет и двойные символы и пустые строки.
1
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
04.02.2022, 13:14
Цитата Сообщение от EduardBal Посмотреть сообщение
Так он удаляет и двойные символы и пустые строки.
Будь тут четкие требования комментарий был бы более вестким.
1
8 / 6 / 2
Регистрация: 29.03.2020
Сообщений: 57
04.02.2022, 19:46
Лучший ответ Сообщение было отмечено kavails как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
int main(void)
{
    FILE* output = fopen("path_out.txt", "w");
    FILE* file = fopen("path_in.txt", "r");
     
    if(!file) return 0;
     
    int size;
    char buffer[512];
    char* ptr;
    size_t i = 0;
    while(fgets(buffer, 512, file))
     {
         ptr = strtok(buffer, " ");
     while(ptr)
       {
        size = strlen(ptr); 
            for (i = 0; i < size - 1; ++i) 
        if(ptr[i] == ptr[i+1] && isalpha(ptr[i]) && (ptr[i+1]!='\n'))
        {
                    ptr = 0;
                    break;
                }
             if(ptr)
        {
                fputs(ptr, output);
        if (*ptr=='\n')
        fputc('\n', output);
        if (*ptr!='\n')
                fputc(' ', output);
                }
            ptr = strtok(0, " ");
           }
      }
    fclose(file);
    fclose(output);
}
Немного подкорректировал. Теперь вывод в том же виде, без слов.

Добавлено через 3 часа 23 минуты
&& (ptr[i+1]!='\n')
Вот это нужно убрать, забыл.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2022, 19:46
Помогаю со студенческими работами здесь

Удалить слова с повторяющимися буквами
тобто потрібно видалити слова типу: Анна сааб іт.п. а всі інші вивести на екран. uses crt; var s:string; i,j:byte; begin ...

Удалить слова со сдвоенными буквами
вобщем нужно удалить слова со сдвоенными буквами в символьном массиве, и я тут совсем запутался. я задаю в фале с расширением .PAS строку...

Найти в файле все слова с двумя согласными буквами
Задание: считать файл, записать в список, найти слова с 2 негласными буквами, подсчитать их количество. (не могу сравнить символы,...

Удалить из предложения слова с большими буквами
Помогите пожалуйста решить задачу. Добавлено через 1 час 32 минуты вот есть такая наработка: Var a,s,s1,s2:string; ...

Удалить слова, в которых есть символы, не являющиеся буквами.
Условие: Удалить все слова, в которых, есть что-то кроме букв. Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru