11
votes

Vérification du dernier char de la chaîne en c

Si j'ai deux types de cordes telles que:

const char *str1 = "This is a string with \"quotes escaped at the end\""; 
const char *str2 = "This is a \"string\" without quotes at the end"; 

testFn(str1);
testFn(str2);

int testFn(const char *str)
{
  // test & return 1 if ends on no quote
  // test & return 0 if ends on quote
  return;
}


1 commentaires

Vous devriez changer cela en int testfn (const char * str)


3 Réponses :


4
votes
int testFn(const char *str)
{
  return !str || !*str || str[strlen(str) - 1] != '\"';
}

1 commentaires

Pourrait s'écraser sur une chaîne vide



16
votes

N'oubliez pas de vous assurer que votre chaîne a au moins 1 caractère: xxx


3 commentaires

(expression)? 0: 1 est une façon amusante d'écrire ! (Expression) :)


@CAF: Peut-être drôle, mais dans ce cas définitivement plus lisible.


@CAF - La raison pour laquelle je préfère ?: est que toute l'expression se lit de gauche à droite.



1
votes
int testFn(const char *str)
{
  if(*str && str[strlen(str + 1)] == '"')
    return 0;
  else
    return 1;
}

2 commentaires

@ PÉTER Török: une chaîne zéro est une chaîne correcte. Un pointeur nulle fait pas décrire une chaîne correcte. Le transmettre comme un argument ici viole la spécification d'entrée. Je déteste des chèques inutiles, ils tuent la performance (quand ils s'accumulent).


@ Péter Török: Je n'ai pas fait. Il suffit de fixer des choses directement pour d'autres lecteurs :-). Je croyez qu'un chèque nul est inutile dans ce cas.