Comment puis-je obtenir argv[] que les int?
j'ai un morceau de code comme ceci:
int main (int argc, char *argv[])
{
printf("%d\t",(int)argv[1]);
printf("%s\t",(int)argv[1]);
}
et de shell, je fais ceci:
./test 7
mais le premier printf résultat n'est pas 7, comment puis-je obtenir argv[] comme un int? merci beaucoup
- Je sais cnicutar déjà donné la réponse, mais il aide à comprendre ce qui se passe. Savez-vous ce que argv[1] est exactement? Je veux dire, pouvez-vous expliquer pourquoi vous obtenez le résultat que vous obtenez?
- À mon avis, argv[0] est la commande elle-même et argv[1] est le premier paramètre I entrée. Dans ce cas, est de 7.
- Oui, c'est vrai, mais qu'en est-il? Ce type? Que pouvez-vous faire avec ça? Pourquoi ne vous obtenez le résultat que vous obtenez dans l'exemple ci-dessus? Pouvez-vous faire l'addition ou la multiplication avec elle, et si l'utilisateur n'est pas un nombre, mais
./test seven
ou quelque chose?
Vous devez vous connecter pour publier un commentaire.
argv[1]
est un pointeur vers une chaîne de caractères.Vous pouvez l'imprimer à l'aide de:
printf("%s\n", argv[1]);
Pour obtenir un entier à partir d'une chaîne, vous devez d'abord le convertir. Utilisation
strtol
pour convertir une chaîne enint
.10
.D'utilisation de base
La "chaîne de long" (
strtol
) la fonction est la norme pour ce ("long" peut contenir des nombres beaucoup plus grands que "int"). C'est la façon de l'utiliser:Depuis que nous utilisons le système décimal, la base est de 10. Le
endpointer
argument va être premier caractère invalide", c'est à dire le premier chiffre. Si vous n'avez pas de soins, définissez l'argument deNULL
au lieu de passer un pointeur, comme illustré.De vérification d'erreur (1)
Si vous ne voulez pas non chiffres à se produire, vous devriez assurez-vous qu'il est défini à l' "terminateur null", depuis un
\0
est toujours le dernier caractère d'une chaîne en C:De vérification d'erreur (2)
Comme le page de man mentionne, vous pouvez utiliser
errno
pour vérifier qu'aucune erreur ne s'est produite (dans ce cas, les débordements ou underflows).Convertir en entier
Alors maintenant, nous sommes coincés avec ce
long
, mais, souvent, nous voulons travailler avec des entiers. Pour convertir unlong
dans unint
, nous devons d'abord vérifier que le nombre est à l'intérieur de la capacité limitée desint
. Pour ce faire, nous ajoutons un deuxième if, et si elle correspond, nous pouvons simplement le jeter.Pour voir ce qui se passe si vous ne le faites pas vérifier, tester le code sans les
INT_MIN
/MAX
si l'instruction. Vous verrez que si vous passez un nombre de plus que de 2 147 483 647 (231), elle déborde et devient négatif. Ou si vous passez un nombre plus petit que -2147483648 (-231-1), il sera dépassement de capacité et de devenir positif. Les valeurs au-delà de ces limites sont trop volumineux pour tenir dans un entier.Exemple complet
De Bash, vous pouvez le tester avec:
À l'aide de
2**31-1
, il doit imprimer le nombre et0
, parce que 231-1 est juste dans la gamme. Si vous passer2**31
à la place (sans-1
), il ne sera pas imprimer le nombre et le statut de sortie sera1
.Au-delà de cela, vous pouvez implémenter des contrôles: vérifier si l'utilisateur est passé d'un argument à tous (à vérifier
argc
), tester si le nombre est dans la plage que vous voulez, etc.Vous pouvez utiliser
strtol
pour que:Alternativement, si vous utilisez C99 ou mieux vous pouvez explorer
strtoimax
.Vous pouvez utiliser la fonction
int atoi (const char * str);
.Vous devez inclure
#include <stdlib.h>
et utiliser la fonction de cette façon:int x = atoi(argv[1]);
Ici plus d'information si nécessaire: atoi - Référence C++
atoi()
. Il fournit aucun moyen de le faire tout de vérification d'erreur à tous. Puisqu'il revientint
, elle renvoie toujours une valeur qui peut être une entrée valide. La seule façon de vérifier siatoi()
renvoie une réponse correcte est d'utiliser une autre méthode pour convertir la valeur d'entrée d'un nombre et de comparer les valeurs. Voir stackoverflow.com/questions/17710018/why-shouldnt-i-use-atoiEspère que cette aide. Bonne chance!