2011-05-14 1 views

Répondre

2
if (strncmp("cs",???, 2)==0) strcat(s,"by professor"); 

Utilisez strncmp

1

Vous pouvez utiliser strncmp.

Edit:

strcat(s,"by professor"); 

// s is an array of 10 characters. You need to make sure s is big enough 
// to hold the string that needs to be concatenated + to have a terminating 
// character '\0'. 
3

pourquoi ne pas comparer directement les personnages plutôt que d'appeler strcmp?

E.g.

si (s [0] == 'c' & & s [1] == 's') { ...}

2

Plusieurs façons de le faire.

Comparaison de chaînes:

if (s[0] == 'c' && s[1] == 's') 

est la manière naïve, comme vous ne pouvez pas développer cela facilement à des codes un peu plus (disons 3/4 caractères).

Je suppose que vous avez compris que vous devriez utiliser strncmp() non?

Chaîne Concaternation

Ne pas utiliser strcat. Vraiment. Si vous concaténez deux chaînes dont la longueur est supérieure à la taille de s (la destination), vous avez des problèmes. Pensez à utiliser snprint() au lieu, comme ceci:

char str[80]; 
snprintf(str, 80, "%s by professor", s); 

Ou, vous pouvez utiliser strncat() comme Heath souligne:

char s[80]; 
strncat(s, " by professor", 80); 
+0

Pourquoi pas strncat()? Beaucoup plus rapide que snprintf(). –

+0

@ Heath point juste, ça fonctionnerait bien. Je pense que je viens d'atteindre pour snprintf d'abord. –

+0

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. –

4

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; 
} 
-1

Oui, comme dit, strcmp est la méthode préférée. Voici juste une façon différente de faire la même chose.

#define CS 29539 
char s[80]; 

scanf("%60s", s); 
if(*(short *)s == CS) 
    if(strlcat(s, " by professor", sizeof(s)) >= sizeof(s)) 
     fprintf(stderr, "WARNING: truncation detected: %s", s); 
+1

Non! S'il vous plaît ne pas essayer cela chez les enfants à la maison. –

Questions connexes