Réponse acceptée !
Bon si on met de coté le fait que c'est pas super propre comme code je vais m'en servir de base et faire la correction de ce code.
Ton erreur vient du fait que ta chaine de base "ping" contient bien evidemment un caractère de fin de chaîne.
en mémoire ca donnerait ca (je mets pas le code caractére associé a chaque lettre ca sert a rien pour cette exemple 'p' 'i ' 'n' 'g'
'\0' Et celui la tu ne l'as pas pris en compte dans ta fonction. Après avoir exécuté ta fonction tu obtiens un truc du genre :
'p' 'i ' 'n' 'g'
'\0' 'x' 'x' 'x' . 'x' 'x' 'x' . 'x' 'x' 'x' . 'x' 'x' 'x'
Ton carcatère de fin de chaine est donc toujours présent et donc ta chaine de caractère passée à la fonction "system(...)" est lue en tant que "ping" alors que l'adresse IP est bien concaténée juste après !! ^^
je te file une modif de code pour ta fonction rajout , elle utilise les libs standards du C tu ferais bien d'en faire autant pour la suite

void rajout(char ip[15], char *cmd){
// j'ai rajouté ton check pour vérifier que la longueur du tout ne faisait pas plus de 40 caracteres
if( (strlen(cmd)+strlen(ip)+1) < 40)
{
// rajouter l'espace avant de concaténer la suite de la chaine de caracteres
strcat(cmd, " ");
// copier l'IP
strcat(cmd,ip);
}
}Voilà ca devrait résoudre ton problème.
Et sinon si je devais corriger ta fonction je ferai ca : (mais bon je te conseille d'utiliser les fonctions de la lib C qui se chargent de réaliser ce genre d'opérations) :
void rajout(char ip[15], char *cmd){
int i, j;
for(i=0;i<40;++i)
{
if(*(cmd+i)>='a' && *(cmd+i)<='z');
else
{
// on remplace le caractere de fin de chaine par le caractere d'espacement ' ' (de valeur 0x20)
*(cmd+i) = ' ';
for(j=i+1;j<40;j++)
{ //mettre une case vide pour l'espace et rajouter l'ip.
*(cmd+j)=ip[j-i-1];
}
}
}
}A plus.
Mess with the best, die like the rest