0
votes

Comment centrer de manière dynamique le texte d'aligner dans une chaîne Char * pour s'adapter à un total de 16 espaces en C?

J'essaie de centrer des chaînes alignées dans un total de 16 espaces pour les imprimer éventuellement sur un écran LCD de 16x2. Les valeurs sont saisies à partir d'une base de données et placez une variable globale qui est constamment mise à jour.

Les valeurs de la base de données sont déjà au format de la chaîne.

Ce que j'aimerais faire est après Obtenir la valeur à partir de la base de données, mettez à jour la variable globale pour contenir une chaîne centrée dans 16 espaces.

Je comprends que l'utilisation de variables globales peut ne pas être la meilleure pratique mais en ignorant qui existe un moyen de faire cela? xxx

0 = un espace vide xxxxx = chaîne de db

si la longueur de la chaîne est impair Je m'attends à ce que la sortie soit [00xxxxxxxxxxxxx0]

si la longueur de la chaîne est même Je m'attends à ce que la sortie soit [00xxxxxxxxxxxx00]


0 commentaires

3 Réponses :


0
votes

Vous pouvez le faire d'une autre manière (sans utiliser la fonction Sprintf). Je ne connais aucune interface de la fonction Sprintf qui vous permettrait de le faire, mais vous pouvez résoudre le problème à l'aide de Simple Strcpy de variables.

Ceci est un programme principal qui résoudrait votre problème, il est documenté dans lui-même, vous devriez donc être capable de comprendre comment l'appliquer à votre code: p> xxx pré>

Lorsque vous modifiez votre code pour travailler avec cela, le code ressemblerait à ceci:

char systemInfoValues[5][17] = {{0}}                                                                                                                                                           
for(int i=0; i< 5; i++){                                                                                                                                                                       
     char *global_reference = PQgetvalue(res,i,0); //get the value from db;                                                                                                                    
     int len = strlen(systemInfoValues[i]);                                                                                                                                                    
     char tmp[20];                                                                                                                                                                             
     int first_index = 0;                                                                                                                                                                      

     strcpy(tmp, global_reference);                                                                                                                                                            
     first_index = (16 - len) / 2;                                                                                                                                                             

     memset(systemInfoValues[i], ' ', 16);                                                                                                                                                               
     strncpy(&(systemInfoValues[i][first_index]), tmp, len);                                                                                                                                   
}        


8 commentaires

D'accord, je vais vérifier une fois que je suis de retour à mon bureau et j'envoie une mise à jour.


Je ne connais aucune interface de la fonction Sprintf qui permettrait ... - je fais; p


Ce genre de travail, je reçois des valeurs aléatoires à la fin des cordes. Sortie: 0xxxxxxxxXXXXX00, 000000XXXX0000008G, 00000XXXXXX00000PG


Je ne peux pas le reproduire. Est-ce que vous runnig ma fonction principale ou votre code? Il semble que quelque chose fonctionne sur le terminateur NULL à la fin (cela se produirait si la longueur que vous avez donnée à la chaîne est 16 et non 17, par exemple).


Permettez-moi de réessayer avec 17


17 le fait pire, index 1 écrase l'indice 3,4,5 et ajoute des caractères aléatoires


Mon code, il semble que les cordes provenant de Pqgetvalue ne jouent pas de chaînes régulières. Voici une description de ce que Pqgetvalue renvoie: "Pour les données en format texte, la valeur renvoyée par PQGetValue est une représentation de chaîne de caractères désignée de la valeur du champ."


Je pense que vous devriez changer votre code pour travailler comme mon dernier exemple, car il semble s'agir d'un problème connecté à la valeur de retour de PqgetValue et non au code de Centenabilité. Si vous pouvez reproduire le problème dans la fonction principale, il est connecté au code de centralisation, mais sinon, il s'agit d'un problème plus connecté à l'intesface que vous utilisez (et pqgetvalue) fonctionne et que je n'ai actuellement pas assez données (de votre question) pour résoudre ce problème.



3
votes

C'est une fonction simple 6 lignes. La symétrie vous donne l'option xxx

ou avec l'option pour allouer la mémoire pour le buff (si vous passez null xxx


7 commentaires

Quelle est l'option de symétrie?


Si même vous ne pouvez même pas avoir celui-ci un espace supplémentaire à droite ou à gauche


Ok, buff ici est la valeur de la base de données et STR est une temp? ou autre solution?


ça ne fait rien


`` `Char TMP [20]; MEMSET (TMP, '', LEN); TMP [LEN] = 0; Memmove (TMP + POS, SysteminFovalues ​​[I], STRL); Strcpy (Systeminfovalues ​​[I], TMP); `` `Résultats en défaut SEG


Utilisez la fonction comme indiqué.


Fonction fonctionne avec "1234567" mais pas avec mes cordes. Voici une description de ce qui est retourné à partir de PQGetvalue: "Pour les données en format texte, la valeur renvoyée par PQGetValue est une représentation de chaîne de caractères désignée de la valeur de champ."



0
votes

sprintf () -comfort: xxx


3 commentaires

Où puis-je trouver assert.h?


@mmajdalani Il devrait faire partie de votre bibliothèque standard compilateurs?


@MMAJDALANI Sinon, vous pouvez supprimer le assert () de la fonction. Assurez-vous simplement que vous ne passez pas le pointeur NULL.