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 ?

1voto

Oh ok, ça a du sens. Alors j'ai fait ça :

    char foo[10] = "hello";
    char padded[16];
    strcpy(padded, foo);
    printf("%s", StringPadRight(padded, 15, " "));

Merci !

1voto

Naga Points 151
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

using namespace std;

int main() {
    // your code goes here
    int pi_length=11; //Total length 
    char *str1;
    const char *padding="0000000000000000000000000000000000000000";
    const char *myString="Monkey";

    int padLen = pi_length - strlen(myString); //length of padding to apply

    if(padLen < 0) padLen = 0;   

    str1= (char *)malloc(100*sizeof(char));

    sprintf(str1,"%*.*s%s", padLen, padLen, padding, myString);

    printf("%s --> %d \n",str1,strlen(str1));

    return 0;
}

0voto

Jeremy Ruten Points 59989

La fonction elle-même me semble correcte. Le problème pourrait être que vous n'allouez pas assez d'espace à votre chaîne pour y ajouter autant de caractères. Vous pourriez éviter ce problème à l'avenir en passant un fichier size_of_string à la fonction et assurez-vous que vous ne remplissez pas la chaîne lorsque la longueur est sur le point d'être supérieure à la taille.

0voto

user4478828 Points 1

Une chose qui ne va pas du tout dans la fonction qui constitue la question initiale de ce fil, et que personne n'a mentionnée, c'est qu'elle concatène des caractères supplémentaires à la fin de la chaîne littérale qui a été passée en paramètre. Cela donne des résultats imprévisibles. Dans l'exemple d'appel de la fonction, la chaîne de caractères "Hello" sera codée en dur dans le programme, et le fait de concaténer des caractères supplémentaires à la fin de la chaîne de caractères entraînera un dépassement dangereux du code. Si vous voulez renvoyer une chaîne plus grande que l'original, vous devez vous assurer de l'allouer dynamiquement et de la supprimer dans le code d'appel lorsque vous avez terminé.

0voto

Ayodeji Points 1
#include<stdio.h>
#include <string.h>

void padLeft(int length, char pad, char* inStr,char* outStr) {
    int minLength = length * sizeof(char);
    if (minLength < sizeof(outStr)) {
        return;
    }

    int padLen = length - strlen(inStr);
    padLen = padLen < 0 ? 0 : padLen;

    memset(outStr, 0, sizeof(outStr));
    memset(outStr, pad,padLen);
    memcpy(outStr+padLen, inStr, minLength - padLen);
}

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