2017-09-06 12 views
1

J'écris une fonction très simple en C pour vérifier si une chaîne est un chemin absolu ou un chemin relatif. Peu importe ce que j'essaie, il revient toujours faux.Vérification de la première lettre d'une chaîne en c

Voici ce que j'ai essayé:

int isAbsolute(char *str){ 
    if(strcmp(str,"/")){ 
     return 1; 
    } 
    return 0; 
} 

et je l'appelle comme:

printf("%d\n", isAbsolute("/")); 

qui revient faux à chaque fois. Clairement, il me manque quelque chose d'évident mais je n'ai pas été capable de le comprendre ...

+4

'strcmp' compare la chaîne entière, il ne retourne true si la chaîne vous passez est «/». Vous pouvez regarder 'strncmp' à la place, ou comparer seulement un caractère (' if (str [0] == '/') '), au lieu d'une chaîne. – AntonH

+0

@AntonH: Pourquoi ne pas placer cela comme une réponse? – alk

+0

@alk Je n'allais que commenter pourquoi cela ne fonctionnait pas, mais j'ai édité une solution après. Mettez-le comme une réponse maintenant ... – AntonH

Répondre

5

N'ayez pas accès à un compilateur, mais je pense que cela fonctionnera parce que les chaînes de style C ne sont que des tableaux avec une terminaison caractère:

int isAbsolute(const char *str){ 
    return (str[0] == '/'); 
} 
+0

Votre premier exemple fonctionne bien –

+2

Vous pouvez utiliser 'const char * str'. – alk

+0

Merci Luke. Je n'ai pas fait de C depuis le lycée lol. –

3

Comme on l'a souligné, strcmp correspond uniquement si les chaînes comparées sont de la même longueur.

Pour comparer un seul caractère à l'avant de la chaîne, vous pouvez simplement faire:

int isAbsolute(const char *str) { 
    return (str[0] == '/'); 
} 

Si le préfixe que vous recherchez est plus d'un caractère, alors this pourrait aider. J'aime mieux la réponse de Fred Foo que celle qui a été acceptée (comme l'a fait la majorité des électeurs).

2

strcmp compare la chaîne entière, donc votre fonction ne retournera que true si la chaîne que vous passez est "/".

Vous pouvez regarder strncmp à la place:

if(strncmp(str,"/", 1)) ... 

ou comparer un seul caractère:

(if (str[0] == '/')) ... 
1

De même pour strncmp vous pouvez utiliser memcmp qui a le nombre d'octets à comparer comme argument:

int isAbsolute(const char *str){ 
    if (0 == memcmp(str, "/", 1){ 
     return 1; 
    } else { 
     return 0; 
    } 
} 

N'oubliez pas que le retour va Lue $ 0 $ signifie l'égalité. Dans votre code, vous renvoyez 0 dans ce cas, ce qui n'est probablement pas conforme à vos intentions.

0

STRCMP valeur de retour est zéro cas de succès, c'est pourquoi il ne va pas vrai