Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kingler1
0 / 0 / 1
Регистрация: 08.04.2016
Сообщений: 21
1

Заменить все слова в исходном файле на количество букв (целое число) в слове

18.06.2016, 06:59. Просмотров 913. Ответов 9
Метки си (Все метки)

Заменить все слова в исходном файле на количество букв (целое число) в сло-
ве. Результат записать в отдельный файл. Записывать числа следует с помощью
функции форматированного вывода fprintf.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2016, 06:59
Ответы с готовыми решениями:

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

Во входном файле задан двумерный массив и целое число K. Заменить все элементы, меньшие K, этим числом
Во входном файле задан двумерный массив и целое число K. Заменить все элементы, меньшие K, этим...

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

Переписать все строки исходного файла, добавив после каждого слова количество букв в этом слове
Помогите пожалуйста, очень срочно нужно сдать код в VBA!!! Нужно открыть файл 1, прочитать его, а...

В исходном файле подсчитать количество слов начинающихся с заданных букв
В исходном файле подсчитать количество слов начинающихся с букв ‘a’, ‘е’, ‘и’, ‘о’. В file2 вывести...

9
nezabudka
1065 / 427 / 156
Регистрация: 28.06.2015
Сообщений: 974
Записей в блоге: 15
18.06.2016, 12:07 2
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
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
 
int main(void)
{
        bool flag = false;
        int count_c = 0;
        char ch; 
        FILE *fi, *fo;
        fo = fopen("text.out", "w");
        fi = fopen("text.in", "r");
        if(!fi && !fo)
                puts("ERROR: не могу открыть файл"), exit(1);
        while((ch = fgetc(fi)) != EOF)
                if(!isspace(ch) && !ispunct(ch))
                {
                        count_c++;
                        flag = true;
                }
                else if(isspace(ch))
                {
                        if(flag)
                        {
                                fprintf(fo, "%d%c", count_c, ch);
                                count_c = 0;
                                flag = false;
                        }
                }
        fclose(fi);
        fclose(fo);
        return 0;
}
0
CoderHuligan
831 / 567 / 205
Регистрация: 30.06.2015
Сообщений: 3,175
Записей в блоге: 28
18.06.2016, 12:35 3
из одной книжки про си: "NULL указатель не обязан быть 0", а это значит, что его не следует использовать в логических выражениях.
Вместо:
C
1
if(!fi && !fo)
Лучше:
C
1
if(fi != NULL  &&  fo != NULL)
ИМХО
1
nezabudka
1065 / 427 / 156
Регистрация: 28.06.2015
Сообщений: 974
Записей в блоге: 15
18.06.2016, 13:05 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

CoderHuligan, Вот как раз ошибка проявилась. Спасибо. Заодно
решила избавится от лишнего флага:
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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
int main(void)
{
        int count_c = 0;
        char ch; 
        FILE *fi, *fo;
        fo = fopen("text.out", "w");
        fi = fopen("text.in", "r");
        if(fi == NULL && fo == NULL)
                puts("ERROR: не могу открыть файл"), exit(1);
        while((ch = fgetc(fi)) != EOF)
                if(!isspace(ch) && !ispunct(ch))
                {
                        count_c++;
                }
                else if(isspace(ch))
                {
                        if(count_c)
                        {
                                fprintf(fo, "%d%c", count_c, ch);
                                count_c = 0;
                        }
                }
        fclose(fi);
        fclose(fo);
        return 0;
}
Добавлено через 8 минут
Фу ты, опять ее повторила. в строке 12 надо заменить "и" на "или"
C
1
if(fi == NULL || fo == NULL)
1
18.06.2016, 13:05
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10623 / 6305 / 1582
Регистрация: 25.07.2009
Сообщений: 12,025
18.06.2016, 20:23 5
CoderHuligan, а там же в книжке ничего не было про то, что в логических выражениях значение NULL должно FALSE возвращать?
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>
//...
char buf[256];
FILE * fin, * fout;
//...
while ( fscanf(fin, "%255s", buf) == 1 )
    fprintf(fout, "%u ", strlen(buf));
//...
1
CoderHuligan
831 / 567 / 205
Регистрация: 30.06.2015
Сообщений: 3,175
Записей в блоге: 28
18.06.2016, 21:14 6
Цитата Сообщение от easybudda Посмотреть сообщение
а там же в книжке ничего не было про то, что в логических выражениях значение NULL должно FALSE возвращать
Нет. Компилятор автоматически приводит к 0 это факт, но NULL предназначен для указателей, а не для выражений.
попытайтесь исполнить такой код:
C
1
printf("%d\n",NULL);
будет предупреждение о том, что тип void * не совпадает с целым типом, что и требовалось доказать
0
nezabudka
1065 / 427 / 156
Регистрация: 28.06.2015
Сообщений: 974
Записей в блоге: 15
18.06.2016, 21:19 7
easybudda, Помойму strlen() возвращает значение size_t в функцию fprintf
со спецификатором %zd Еще встречала %zu. Если не ошибаюсь стандарт С99 и С11
0
CoderHuligan
831 / 567 / 205
Регистрация: 30.06.2015
Сообщений: 3,175
Записей в блоге: 28
18.06.2016, 21:34 8
И это естественно, так как NULL не должен указывать на нулевой адрес. Здесь: http://c-faq.com/null/nullor0.html написано: "It is only in pointer contexts that NULL and 0 are equivalent. NULL should not be used when another kind of 0 is required, even though it might work, because doing so sends the wrong stylistic message. (Furthermore, ANSI allows the definition of NULL to be ((void *)0), which will not work at all in non-pointer contexts.) In particular, do not use NULL when the ASCII null character (NUL) is desired."
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10623 / 6305 / 1582
Регистрация: 25.07.2009
Сообщений: 12,025
19.06.2016, 00:25 9
Цитата Сообщение от CoderHuligan Посмотреть сообщение
NULL should not be used when another kind of 0 is required, even though it might work, because doing so sends the wrong stylistic message.
Параноя какая-то... А вот до этого
Цитата Сообщение от CoderHuligan Посмотреть сообщение
do not use NULL when the ASCII null character (NUL) is desired.
ещё додуматься надо... ASCII null character - это '\0', а нулевой указатель - NULL, не заморачиваясь на том, что и то и другое - 0 по сути, заменять одно другим разве-что при температуре под 40 в голову прийдёт. Я о другом:
C
1
if ( simePointer != NULL )
абсолютно то же самое, что и
C
1
 if ( somePointer )
Мало того!
C
1
if ( *someStr != '\0' )
то же, что и
C
1
if ( *someStr )
Добавлено через 2 минуты
Цитата Сообщение от nezabudka Посмотреть сообщение
Помойму strlen() возвращает значение size_t в функцию fprintf
со спецификатором %zd Еще встречала %zu. Если не ошибаюсь стандарт С99 и С11
Да, правильно. Только оно в таком виде у счастливых обладателей MSVS не работает - мелкостудия в полном объёме только ANSI C 89 поддерживает.
2
CoderHuligan
831 / 567 / 205
Регистрация: 30.06.2015
Сообщений: 3,175
Записей в блоге: 28
19.06.2016, 12:05 10
Цитата Сообщение от easybudda Посмотреть сообщение
Я о другом:
CВыделить код
1
if ( simePointer != NULL )
абсолютно то же самое, что и
CВыделить код
1
*if ( somePointer )
На данный момент это соглашение соблюдается, но кто знает что будет завтра? Ведь несоответствие типов налицо, да и приведение неявное, скрытое компилятором, что напрягает.
Цитата Сообщение от easybudda Посмотреть сообщение
Мало того!
CВыделить код
1
if ( *someStr != '\0' )
то же, что и
CВыделить код
1
if ( *someStr )
С этим, как раз, всё в порядке, так как тип char и int практически соответствуют друг другу, и '\0' = 0 на все 100%
0
19.06.2016, 12:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2016, 12:05

Во вводимой строке заменить все слова с цифрами на такое же количество букв A
Во вводимой строке заменить все слова с цифрами на такое же количество букв A. Здравствуйте, у...

Подсчитать количество гласных букв в исходном файле, результат записать в файл g
Создать и заполнить текстом файл f.Подсчитать количество гласных букв,результат записать в файл g.

Заменить в исходном файле все отрицательные числа на положительные и наоборот
На экзамене попалась задачка, но решить ее до конца я так и не смог,за что поплатился низким...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.