90 votes

Remplissage des chaînes de caractères en C

J'ai écrit cette fonction qui est censée faire StringPadRight("Hello", 10, "0") -> "Hello00000".

char *StringPadRight(char *string, int padded_len, char *pad) {
    int len = (int) strlen(string);
    if (len >= padded_len) {
        return string;
    }
    int i;
    for (i = 0; i < padded_len - len; i++) {
        strcat(string, pad);
    }
    return string;
}

Cela fonctionne mais a des effets secondaires bizarres... certaines des autres variables sont modifiées. Comment puis-je corriger cela ?

193voto

Tom Leys Points 10453

Il peut être utile de savoir que printf fait le remplissage pour vous, en utilisant %-10s comme chaîne de format, le remplissage se fera à droite dans un champ de 10 caractères.

printf("|%-10s|", "Hello");

produira

|Hello     |

Dans ce cas, le symbole - signifie "Alignement à gauche", le 10 signifie "Dix caractères dans le champ" et le s signifie que vous alignez une chaîne de caractères.

Le formatage de style Printf est disponible dans de nombreuses langues et dispose de nombreuses références sur le web. Voici une page parmi d'autres expliquant les drapeaux de formatage. Comme d'habitude La page printf de WikiPedia est également utile (surtout une leçon d'histoire sur la façon dont printf s'est répandu).

47voto

J Jorgenson Points 632

Pour 'C', il existe une autre utilisation (plus complexe) de [s]printf qui ne nécessite pas de malloc() ou de préformatage, lorsque le remplissage personnalisé est souhaité.

L'astuce consiste à utiliser les spécificateurs de longueur '*' (min et max) pour %s, plus une chaîne de caractères remplie de votre caractère de remplissage jusqu'à la longueur maximale potentielle.

int targetStrLen = 10;           // Target output length  
const char *myString="Monkey";   // String for output 
const char *padding="#####################################################";

int padLen = targetStrLen - strlen(myString); // Calc Padding length
if(padLen < 0) padLen = 0;    // Avoid negative length

printf("[%*.*s%s]", padLen, padLen, padding, myString);  // LEFT Padding 
printf("[%s%*.*s]", myString, padLen, padLen, padding);  // RIGHT Padding 

Le "%*.*s" peut être placé avant OU après votre "%s", selon le désir de remplissage GAUCHE ou DROIT.

[####Monkey] <-- Left padded, "%*.*s%s"
[Monkey####] <-- Right padded, "%s%*.*s"

J'ai découvert que la méthode PHP printf ( aquí ) prend en charge la possibilité de donner un caractère de remplissage personnalisé, en utilisant le guillemet simple (') suivi de votre caractère de remplissage personnalisé dans le format %s.
printf("[%'#10s]\n", $s); // use the custom padding character '#'
produit :
[####monkey]

5voto

Izya Budman Points 119
#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[BUFSIZ] = { 0 };
    char str[] = "Hello";
    char fill = '#';
    int width = 20; /* or whatever you need but less than BUFSIZ ;) */

    printf("%s%s\n", (char*)memset(buf, fill, width - strlen(str)), str);

    return 0;
}

Sortie :

$ gcc -Wall -ansi -pedantic padding.c
$ ./a.out 
###############Hello

2voto

Greg Hewgill Points 356191

Vous devez vous assurer que la chaîne d'entrée dispose d'un espace suffisant pour contenir tous les caractères de remplissage. Essayez ceci :

char hello[11] = "Hello";
StringPadRight(hello, 10, "0");

Notez que j'ai alloué 11 octets pour le hello pour tenir compte de la terminaison nulle à la fin.

1voto

Eugene Yokota Points 43213

L'argument que vous avez passé à "Hello" se trouve dans la zone des données constantes. À moins que vous n'ayez alloué suffisamment de mémoire au char * string, il déborde sur d'autres variables.

char buffer[1024];
memset(buffer, 0, sizeof(buffer));
strncpy(buffer, "Hello", sizeof(buffer));
StringPadRight(buffer, 10, "0");

Edit : Corrected from stack to constant data area.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X