С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Функция доводит длину строки до заданной, вставляя пробелы между словами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Во всех последовательностях положительных чисел ограничить снизу значения тех элементов, значения которых меньше среднего для этой последовательности http://www.cyberforum.ru/cpp-beginners/thread148602.html
Помогите с кодом программы на С Во всех последовательностях положительных чисел ограничить снизу значения тех элементов, значения которых меньше среднего для этой последовательности,...
C++ string и массив строк у меня массив строк = 'aaaaaaaa'; = 'xxx()'; = 'ddddd'; = 'eeeeee'; потом нужно вместо потом нужно вместо xxx() вставить нескольк строк в первый массив так чтобы у первого массива... http://www.cyberforum.ru/cpp-beginners/thread148592.html
C++ приоритеты операций
Интересную ошибку нахожу в книгах по части приоритетов операций в C++: например здесь и здесь указано, что у косвенности (*) больший приоритет чем у индексации (например), если бы это было...
Строки и указатели с++ C++
1. С клавиатуры вводится полный путь к файлу. Напишите программу, которая выделяет из этой строки имя файла Пример: C:\windows\system32\activeds.dll activeds.dll 2. Напишите программу, которая...
C++ Реализация связного списка http://www.cyberforum.ru/cpp-beginners/thread148542.html
надо решить задачу: Сведения о владельце автомобиля: фамилия, марка автомобиля (строки), номер автомобиля (целое число). По сведениям в файле о некотором количестве владельцев автомобилей получить...
C++ Не компилируется программа из книги Переписал из книги первую простейшую программу для Win32 a simple message box #define WIN32_LEAN_AND_MEAN #include <windows.h> // the main windows headers #include <windowsx.h> ... подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,864
23.06.2010, 17:39
о, как!
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct WRD {
    char * text;
    int len;
    struct WRD * next;
} wrd_t;
 
wrd_t * new_word(const char * s, wrd_t * last){
    wrd_t * w;
    if ( ( w = (wrd_t*)malloc(sizeof(wrd_t)) ) == NULL )
        return NULL;
    if ( ( w->text = strdup(s) ) == NULL ){
        free(w);
        return NULL;
    }
    w->len = strlen(w->text);
    w->next = NULL;
    if ( last )
        last->next = w;
    return w;
}
 
int words_len(const wrd_t * w){
    int len = 0;
    while ( w ){
        len += w->len;
        w = w->next;
    }
    return len;
}
 
void delete_words(wrd_t * w){
    wrd_t * t;
    while ( w ){
        t = w->next;
        free(w->text);
        free(w);
        w = t;
    }
}
 
char * justify(const char * s, const char * delim, int width){
    char * bufIn, * bufOut, * pBuf, * pWrd;
    int regular, extra, len, cnt, i;
    wrd_t * first, * last, * cur;
 
    if ( ( bufIn = strdup(s) ) == NULL )
        return NULL;
    cnt = 0;
    first = last = NULL;
    for ( pWrd = strtok(bufIn, delim); pWrd; pWrd = strtok(NULL, delim) ){
        if ( ( last = new_word(pWrd, last) ) == NULL ){
            if ( first )
                delete_words(first);
            return NULL;
        }
        if ( ! first )
            first = last;
        ++cnt;
    }
    free(bufIn);
 
    if ( ! first )
        return NULL;
    if ( cnt == 1 ){
        bufOut = strdup(first->text);
        delete_words(first);
        return bufOut;
    }
 
    len = words_len(first);
    if ( len + cnt - 1 > width ){
        bufOut = strdup("Too long!");
        delete_words(first);
        return bufOut;
    }
 
    if ( ( bufOut = (char*)malloc(width + 1) ) == NULL ){
        delete_words(first);
        return NULL;
    }
    regular = (width - len) / (cnt - 1);
    extra = (width - len) % (cnt - 1);
    pBuf = bufOut;
    for ( cur = first; cur != NULL; cur = cur->next ){
        if ( ! memcpy(pBuf, cur->text, cur->len) ){
            free(bufOut);
            delete_words(first);
            return NULL;
        }
        pBuf += cur->len;
        if ( cur->next ){
            for ( i = 0; i < regular; ++i )
                *pBuf++ = ' ';
            if ( extra ){
                *pBuf++ = ' ';
                --extra;
            }
        }
    }
    *pBuf = '\0';
    delete_words(first);
    return bufOut;
}
 
#define WIDTH 60
#define DELIM " \t\n"
 
int main(void){
    char buf[BUFSIZ], * p;
 
    while ( 1 ){
        printf("> ");
        if ( ! fgets(buf, BUFSIZ, stdin) ){
            perror("fgets");
            exit(EXIT_FAILURE);
        }
        if ( *buf == '\n' )
            break;
        if ( p = justify(buf, DELIM, WIDTH) ){
            printf("%s\n", p);
            free(p);
        }
        else {
            fprintf(stderr, "Memory or other error!\n");
            exit(EXIT_FAILURE);
        }
    }
 
    exit(EXIT_SUCCESS);
}
Функция доводит длину строки до заданной, вставляя пробелы между словами
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.