Vous êtes à la recherche de la fonction strncmp
qui est fonctionnellement identique à strcmp
mais limite le nombre des caractères vérifiés. Donc, vous l'utiliseriez avec une longueur de deux et la chaîne de comparaison de "cs"
. Mais, vous avez quelques autres problèmes ici. D'abord, votre tampon n'est pas assez grand. Il n'y a pas de chaîne qui puisse tenir dans un tampon de dix caractères lorsque vous y ajoutez le texte "par professeur".
Ensuite, le code robuste n'utilisera jamais scanf
avec un spécificateur de format de chaîne non borné: cela demande un problème de débordement de tampon. La famille scanf
est destiné à l'entrée FORMATTé il y a peu plus que non formatée entrée utilisateur :-)
Si vous voulez une solution d'entrée robuste, voir one of my previous answers.Troisièmement, vous devez toujours supposer que la concaténation d'une chaîne peut déborder votre tampon et introduire du code pour l'empêcher. Vous devez ajouter:
- la longueur actuelle de la chaîne, entrée par l'utilisateur.
- la longueur de la chaîne d'ajout ("par professeur").
- un de plus pour le terminateur null.
et de s'assurer que le tampon est assez grand. La méthode que j'utiliserais serait d'avoir un (par exemple) tampon de 200 octets, utilisez getLine()
de la réponse liée (reproduite ci-dessous pour rendre cette réponse autonome) avec une taille suffisamment petite (disons 100), alors vous pouvez être assuré que l'ajout "par professeur" ne débordera pas le tampon.
Fonction:
#include <stdio.h>
#include <string.h>
#define OK 0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
int ch, extra;
// Get line with buffer overrun protection.
if (prmpt != NULL) {
printf ("%s", prmpt);
fflush (stdout);
}
if (fgets (buff, sz, stdin) == NULL)
return NO_INPUT;
// If it was too long, there'll be no newline. In that case, we flush
// to end of line so that excess doesn't affect the next call.
if (buff[strlen(buff)-1] != '\n') {
extra = 0;
while (((ch = getchar()) != '\n') && (ch != EOF))
extra = 1;
return (extra == 1) ? TOO_LONG : OK;
}
// Otherwise remove newline and give string back to caller.
buff[strlen(buff)-1] = '\0';
return OK;
}
code de test:
// Test program for getLine().
int main (void) {
int rc;
char buff[10];
rc = getLine ("Enter string> ", buff, sizeof(buff));
if (rc == NO_INPUT) {
// Extra NL since my system doesn't output that on EOF.
printf ("\nNo input\n");
return 1;
}
if (rc == TOO_LONG) {
printf ("Input too long [%s]\n", buff);
return 1;
}
printf ("OK [%s]\n", buff);
return 0;
}
Pourquoi pas strncat()? Beaucoup plus rapide que snprintf(). –
@ Heath point juste, ça fonctionnerait bien. Je pense que je viens d'atteindre pour snprintf d'abord. –
Il ya environ un an, j'ai écrit mon propre snprintf(). C'était beaucoup plus facile que je l'avais imaginé/craint. C'était aussi éducatif. Le résultat a été moins lent à cause de "l'analyse de chaîne de format" que je l'avais supposé avant de l'écrire. Je n'ai pas supporté autre chose que ASCII/ANSI - sorte de K & R sprintf() + le n qui le fait snprintf(). Je voulais juste partager cela parce que j'encourage les gens à écrire un snprintf() pour le plus grand plaisir. –