web-dev-qa-db-fra.com

Printf un tampon de char avec une longueur en C

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:

  • impression char par char avec une boucle for
  • en utilisant le caractère de terminaison
  • ou en utilisant. *

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

18
Roman Rdgz

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.

27
Matteo Italia

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);
42
Soren

Vous pouvez mettre un NUL (0x0) dans le tampon après avoir reçu le dernier caractère.

buffer[i] = 0;

3
Gowtham

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.

2
Michael Price