0
votes

Accéder à la variable à l'extérieur tandis que la boucle C

Je suis très nouveau à c afin de pardonner cette question stupide. J'ai ce code suivant qui lit la 3ème ligne à partir d'un fichier texte, qui est le numéro 38. J'ignore cela à un INT dans la boucle tandis que vous obtenez un résultat différent lors de l'accès à cette variable à l'extérieur de la boucle tandis que. Ceci est mon code: XXX

Désolé si c'est vague, et cela sera probablement supprimé, mais s'il vous plaît, donnez-moi d'aide haha!


6 commentaires

Number est de type int et vous attribuez un char * sans une coulée correcte.


Avez-vous changé le code après l'avoir posté? J'aurais pu assermenté en dehors du pendant Boop que vous avez utilisé "% d" dans votre printf au lieu de % s . Si vous modifiez le point où l'erreur se produit, elle confondra les gens à essayer de répondre à la question.


Je vous ai mal dirigé, printf ("% d", numéro); pourrait aider, avec atoi comme dans la réponse de @Danielh.


Essayez-vous d'imprimer ligne comme indiqué dans printf ("% s", ligne); à l'extérieur du moment ou d'essayer d'imprimer numéro ?


Essayer d'imprimer le numéro en fait mon mauvais!


Ive a édité le code de sorte qu'il imite le numéro, désolé tout!


3 Réponses :


0
votes

en C, le type d'une variable est important. Le type de ligne est char [256] , ce qui signifie qu'il s'agit d'un tableau de 256 caractères, ce qui est dans ce cas plus que suffisant pour maintenir la longueur de la ligne.

Cependant, numéro est un int . C Travaille difficile à convertir les types de manière raisonnable, mais sa définition de "raisonnable" n'est pas la vôtre. Il stocke l'adresse ligne est trouvé dans la mémoire dans le numéro . Ensuite, dans printf à l'intérieur de la boucle tandis que vous pouvez imprimer à l'aide de "% s" , de sens "Traitez-le comme s'il s'agissait d'une bande de caractères en mémoire ", ce qu'il s'avère être, alors ça marche.

En dehors de la boucle tandis que vous utilisez "% d" , qui dit "Imprimer ceci comme s'il s'agit d'un nombre". Techniquement, c'est un nombre, mais ce n'est pas le numéro 38; C'est un nombre qui n'a aucun sens pour vous et pas beaucoup de sens pour même les personnes expertes en c.

Pour résoudre ce problème, vous devez convertir la chaîne en un numéro (si vous voulez faire des mathématiques dessus) ou simplement le stocker comme texte et ne prétendez jamais que c'est un nombre. Pour le convertir en un numéro, utilisez atoi () .

Vous devez activer des avertissements sur votre compilateur afin que cela vous dira si vous faites ce genre de chose à l'avenir. En fonction de la compilation de votre compilation, vous pouvez modifier certains paramètres de votre IDE (comme Visual Studio ou Eclipse) ou vous pouvez ajouter quelque chose à la ligne de commande Compiler, telle que l'utilisation de gcc -wall -wextra -peantique au lieu de juste gcc .


0 commentaires

2
votes

Votre boucle tandis que vous continuez à courir même après votre première impression. Et le tray code> la ligne code> continue de mettre à jour dans la ligne obtient (ligne, taille de (ligne), fichier) code>.

#include <stdio.h>
#include <stdlib.h>

int main()
{

    FILE *file = fopen("blocks.txt", "r");
    char line[256];
    long int number;
    int i = 0;
    char *stopped;

    /*keeps updating line till fget returns a failed response*/
    while (fgets(line, sizeof(line), file))
    {
        i++;
        if (i == 3)
        {
            number = (int)strtol(line, &stopped, 10);
            if (!*stopped)
            { /* handle error */
                printf("Error in strtol\n");
                return -1;
            }
            //prints 38
            printf("%s", line);
        }
    }
    /*Once the while loop ends it will have the last 
    line of the file block.txt*/
    printf("%ld", number);
    fclose(file);
    getchar();
    return 0;
}


4 commentaires

Hmm, pourquoi numéro = ligne ignoré?


@ jackw11111 Je l'ai supprimé parce que ce n'était pas utilisé. Je compile généralement tous les avertissements pédétiques


Ok, c'est vrai. Mais la question, bien que paraffinement ambiguë, semble demander d'attribuer un int à l'intérieur d'un pendant la boucle et d'essayer d'accéder à la même variable en dehors de la boucle.


@ jackw11111 essaie-t-il d'imprimer ligne en dehors du numéro ou du numéro . Ma réponse est pour ligne .



1
votes

Votre confusion provient de l'impression ligne code> dans la boucle, puis tentant d'imprimer numéro code> après la boucle. LIGNE CODE> est TYPE CHAR [256] CODE> QUI SUR L'Access est converti en simple char * code>. numéro code> est TYPE INT code>. Vous ne pouvez pas attribuer char * code> à int code>.

Pour convertir les chiffres ASCII dans LIGNE CODE> vers un (code> entier Code> Vous pouvez utiliser sscanf code> (approprié dans ce contexte) ou vous pouvez utiliser strtol code> (ou vous pouvez le convertir manuellement avec modulo et division). P>

Ici, vous lisez correctement une ligne d'entrée avec la fonction d'entrée em> orientée em> fgets code> (c'est bon). Vous avez simplement besoin de convertir les chiffres ASCII dans LIGNE CODE> vers un entier. Vous pouvez le faire avec sscanf code>, par exemple: p> xxx pré>

( Remarque: strong> la validation de la conversion avec SSCANF CODE> en vérifiant le retour sur le nombre de conversions demandées - Valider chaque lecture ou chaque conversion) p>

Remarque, ne ne em> noms de fichiers ou chiffres. principale () code> prend des arguments, argc code> contient le nombre d'arguments présents (il y aura toujours au moins au moins 1 code> argument, le nom de l'exécutable), et argv code> est votre vecteur d'argument (une matrice de pointeurs à chaque argument avec le pointer suivant après le dernier argument défini sur null code>) transmettez votre nom de fichier à votre programme en tant qu'argument. Vous pouvez également définir de manière conditionnelle votre programme à lire à partir du nom de fichier fourni comme premier argument ou à partir de stdin code> par défaut si aucun argument n'est fourni. P>

Mettre tout cela possible, vous pourriez faire : p> xxx pré>

exemple fichier d'entrée strong> p> xxx pré>

$ ./bin/readline3 dat/3line.txt
number inside loop : 38
number outside loop: 38


2 commentaires

Merci beaucoup pour cette information, j'apprécie vraiment cela, je suis nouveau à C pour que ce soit bien d'avoir bien les choses expliquées!


Nous avons tous commencé du même endroit. Il y a beaucoup à apprendre avec C, alors ralentissez-vous, faites attention aux détails, à tout valider et profitez d'une langue fantastique. Bonne chance avec votre codage.