The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Строковые типы в C"
Версия для распечатки Пред. тема | След. тема
Форум Программирование под UNIX
Исходное сообщение [ Отслеживать ]

. "Строковые типы в C" –1 +/
Сообщение от datswd (?), 04-Ноя-14, 18:49 
Результатом стало следующее.

Для того чтобы в C по-человечески работать с строками была создана библиотека mstring, функции которой выполняя операции со строками выделяют соответствующее количество памяти в куче.

------mstring.h
char* Msprintf(char* To, char* Fmt, ...);
//форматированный вывод в строку To с заменой её содержимого

char* MCsprintf(char* To, char* Fmt, ...);
//форматированный вывод в конец строки To

char* Mstrcat(char* CatTo, char* ToCat);
//Вывод строки ToCat в переменную CatTo

char* Mstrcpy(char* CpyTo, char* ToCpy);
//Копирование строки ToCpy в строку CpyTo

int IsPosDigit(char* ToCheck);
//Является ли строка ToCheck положительным числом, то есть все символы 0-9

И со строкой работать нужно вот так вот.

char* MyString = NULL //Определяем указатель

int I = 5;
MyString = Msprintf(MyString, "lalala blblb %i", I); //Делаем форматированный вывод в строку MyString
printf("%s", MyString); //Выводим строку MyString

if(MyString) free(MyString); //Если MyString не NULL освобождаем выделенную память


Ну и собственно исходный код библиотеки.


------mstring.c

char* MCsprintf(char* To, char* Fmt, ...) {
    va_list Ptr;
    va_start(Ptr, Fmt);
    int L = vsnprintf(NULL, 0, Fmt, Ptr);
    va_end(Ptr);
    int M = To ? strlen(To) : 0;
    To = (char *)realloc(To, (L + M + 2) * CHAR_SIZE);
    va_start(Ptr, Fmt);
    vsprintf(To + M, Fmt, Ptr);
    va_end(Ptr);
    return To;
}

char* Msprintf(char* To, char* Fmt, ...) {
    va_list Ptr;
    va_start(Ptr, Fmt);
    int L = vsnprintf(NULL, 0, Fmt, Ptr);
    va_end(Ptr);
    if(To) free(To);
    To = (char *)calloc((L + 2), CHAR_SIZE);
    va_start(Ptr, Fmt);
    vsprintf(To, Fmt, Ptr);
    va_end(Ptr);
    return To;
}

int IsPosDigit(char *ToCheck) {
    if(ToCheck && strlen(ToCheck)) {
        int I = 0;
        for(I = 0; I < strlen(ToCheck); I++) if(!isdigit(ToCheck[I])) return 0;
        return 1;
    }
    else return 0;
}

char* Mstrcat(char* CatTo, char* ToCat) {
    int P = CatTo ? strlen(CatTo) : 0;
    CatTo = (char*)realloc(CatTo, (P + strlen(ToCat) + 2) * CHAR_SIZE);
    strcpy(CatTo + P, ToCat);
    return CatTo;
}

char* Mstrcpy(char* CpyTo, char* ToCpy) {
    if(ToCpy) {
        if(CpyTo) free(CpyTo);
        CpyTo = (char*)calloc(strlen(ToCpy) + 2, CHAR_SIZE);
        strcpy(CpyTo, ToCpy);
    }
    return CpyTo;
}

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Строковые типы в C, noisebringer, 24-Июн-14, 16:28  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру