J'ai un tampon que je reçois via un port série. Lorsque je reçois un certain caractère, je sais qu'une ligne complète est arrivée et je veux l'imprimer avec la méthode printf
. Mais chaque ligne a une valeur de longueur différente, et quand je vais avec:
printf("%s", buffer);
J'imprime la ligne plus les caractères supplémentaires appartenant à l'ancienne ligne (si elle était plus longue que la ligne actuelle).
J'ai lu ici qu'il est possible, au moins en C++, de dire combien de caractères vous voulez lire étant donné un %s
, mais il n'a pas d'exemples et je ne sais pas comment le faire en C. Une aide?
Je pense que j'ai trois solutions:
for
LA QUESTION EST: Laquelle est la plus rapide? Parce que je travaille sur une puce PIC et je veux que ça se passe le plus vite possible
La chaîne que vous avez n'est pas terminée par un caractère nul, donc, printf
(et toute autre fonction de chaîne C) ne peut pas déterminer sa longueur, donc elle continuera à écrire les caractères qu'elle y trouve jusqu'à ce qu'elle tombe sur un caractère nul qui se trouve être là.
Pour résoudre votre problème, vous pouvez soit:
utilisez fwrite
sur stdout
:
fwrite(buffer, buffer_length, 1, stdout);
Cela fonctionne parce que fwrite
n'est pas conçu pour imprimer uniquement des chaînes, mais tout type de données, il ne recherche donc pas de caractère nul de fin, mais accepte la longueur des données à écrire comme paramètre;
null-terminer votre tampon manuellement avant l'impression:
buffer[buffer_length]=0;
printf("%s", buffer); /* or, slightly more efficient: fputs(buffer, stdout); */
Cela pourrait être une meilleure idée si vous devez effectuer tout autre traitement de chaîne sur buffer
, qui sera désormais terminé par un caractère nul et donc gérable par les fonctions normales de traitement de chaîne C.
Vous pouvez soit ajouter un caractère nul après votre caractère de fin, et votre printf fonctionnera, ou vous pouvez ajouter un '.*'
dans votre déclaration printf et indiquez la longueur
printf("%.*s",len,buf);
En C++, vous utiliseriez probablement la chaîne std :: et std :: cout à la place, comme ceci:
std::cout << std::string(buf,len);
Si tout ce que vous voulez, c'est la vitesse la plus rapide et aucun formatage - utilisez
fwrite(buf,1,len,stdout);
Vous pouvez mettre un NUL (0x0) dans le tampon après avoir reçu le dernier caractère.
buffer[i] = 0;
Une fois que vous avez identifié la fin de la ligne, vous devez ajouter un '\0'
à la fin du tampon avant de l'envoyer à printf
.