J'ai une application C
(n'utilisant pas les fonctionnalités C99) qui effectue un traitement de chaîne lourd. Puisque les longueurs de chaîne ne sont pas connues, les tampons alloués statiquement ne sont pas une option pour moi. J'ai créé une implémentation string
simple qui résumera la terminaison nulle et l'expansion dynamique des tampons.Ajout de la prise en charge de la mise en forme à une implémentation de chaîne personnalisée - C
Voici à quoi ça ressemble,
struct strbuf {
char *buffer; /* null terminated buffer */
size_t length; /* length of the string excluding null terminator */
size_t allocated; /* total memory allocated */
};
fonction add
qui ajoute la chaîne fournie dans le tampon.
int strbuf_add(struct strbuf *string, const char *c)
{
if(string == NULL) return 0;
while(*c != '\0') {
if(!add_char(string, *c++))
return 0;
}
return 1;
}
static int add_char(struct strbuf *string, char c)
{
size_t space_available;
assert(string != NULL);
space_available = string->allocated - string->length;
if(space_available <= 1) {
if(!grow_buffer(string)) {
return 0;
}
}
string->buffer[string->length++] = c;
string->buffer[string->length] = '\0';
return 1;
}
Maintenant, je dois ajouter une nouvelle méthode quelque chose comme, addformatted
qui prendra un format comme sprintf
. Je me demande quelle serait la meilleure façon de faire cela? Voici mes pensées.
- Utilisez
vsnprintf
. Mais je ne suis pas sûr que ce soit portable et ait le même comportement sur toutes les plateformes. - Écrire moi-même un analyseur de format. Mais cela semble être plus de travail.
Toute aide dans la mise en œuvre de ce serait génial. Je ne suis intéressé que par les solutions portables.
- Dev Env: Linux avec GCC
- prévu pour compiler sur MSVC
Au moins, snprintf devrait être portable. –
traitement de chaîne lourde en C? Tu ne peux pas utiliser awk ou perl? – Nyan
3. Écrivez une fonction qui interpole vos objets stringins dans une chaîne de contrôle sprintf, puis passe la chaîne de contrôle étendue et les arguments supplémentaires à * printf. indice: varargs. Mais Nyan l'a ancré: utilisez un langage approprié à la tâche qui a de vraies chaînes en tant que types réels. – msw