2017-10-20 15 views
-1

Je suis un démarreur C et viens d'apprendre la base de la programmation. Quand j'ai pratiqué le codage, j'ai remarqué quelque chose d'étrange au sujet de la sortie inattendue dont je ne connais pas les raisons et que je ne peux même pas décrire le problème.Code C - Pourquoi la sortie a renvoyé une valeur inattendue dans mon code?

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 

int main() 
{ 
    int numberEntered = 0; 
    int index = 0; 
    char input[32]; 
    int TotalNum = 0; 
    int x = 1; 
    int array[x]; 

    printf("Please enter the size of the array: "); 
    fgets(input,32,stdin); 
    x = atoi(input); 

    for(index =0; index < x; index++) 
    { 
     printf("\nPlease enter your number:"); 
     fgets(input,32,stdin); 

     numberEntered = atoi(input); 
     printf("The number you entered is : %d\n",numberEntered); 


     array[index] = numberEntered; 

     TotalNum ++; 
    } 

    for(index = 0; index < TotalNum; index++) 
    { 
     printf("array[%d] = %d\n",index,array[index]); 
    } 
    return 0; 
} 

Lors de la saisie par l'utilisateur an x ​​= 15; Et les utilisateurs entrent alors des nombres de 1 à 15; La sortie était:

array[0] = 1 
array[1] = 2 
array[2] = 3 
array[3] = 4 
array[4] = 5 
array[5] = 6 
array[6] = 7 
array[7] = 668977 
array[8] = 9 
array[9] = 10 
array[10] = 11 
array[11] = 12 
array[12] = 13 
array[13] = 14 
array[14] = 15 

je me attends à l'origine que le tableau [7] devrait me donner une sortie de tableau [7] = 8, puisque le nombre « 8 » est ce que les utilisateurs typés. Cependant, il a changé en nombres aléatoires. Je voudrais savoir la raison de cela.

+2

'int x = 1; int array [x]; '- Quelle est la taille de votre tableau lorsque vous le créez? Changer 'x' plus tard ne fera pas grandir magiquement votre tableau. –

Répondre

3
int x = 1; 
int array[x]; 

printf("Please enter the size of the array: "); 
fgets(input,32,stdin); 
x = atoi(input); 

Cette ligne modifie la valeur de x, mais pas la taille de array. Vous ne pouvez donner une taille à un tableau qu'au moment où il est déclaré. *)

Réorganiser ce qui suit:

printf("Please enter the size of the array: "); 
fgets(input,32,stdin); 
int x = atoi(input); 
int array[x]; 

Sur une note de côté, atoi() est pas bon pour vérifier les erreurs (que vous devez faire sur l'entrée interactive). Utilisez strtol() à la place, et assurez-vous de lire the manpage, de sorte que vous utilisez toutes les possibilités pour détecter les erreurs.


*) Notez la fonction que vous utilisez ici est appelé tableau de longueur variable (VLA), mais le mot « variables » signifie seulement que la taille du tableau n'est pas un compile- constante de temps. Il ne pas signifie que vous pouvez modifier la taille une fois que le tableau existe - ce serait un tableau dynamique , que vous devez implémenter vous-même en C (en utilisant malloc() et realloc()).

Notez également VLAs, bien que très répandue, ne pas ont pour être pris en charge, C11 en fait une caractéristique optionnelle. Si vous ne disposez pas VLA disponible, vous devez utiliser un tableau de taille assez grande fixe ou affecter votre tableau vous en utilisant malloc(), dans ce cas, il ressemblerait

int x = atoi(input); 
int *array = malloc(x * sizeof *array); 

Ne pas oublier de vérifier array pour NULL Lorsque vous faites cela et n'oubliez pas de free(array); lorsque vous avez terminé avec elle.

1

Huh?

Lorsque vous faites ceci:

int x = 1; 
int array[x]; 

Vous obtiendrez un tableau 1-élément appelé array. Changer la valeur de x plus tard ne redimensionne pas magiquement le tableau. Mettez la déclaration array[x]après en obtenant la valeur correcte de x.

Et ajouter des vérifications pour les appels d'E/S, ils peuvent échouer.

0
int x = 1; 
int array[x]; 

Il limite la taille de votre tableau. Ne fais pas comme ça.

0

Quoi?

int x = 1; 
    int array[x]; 

    // ..... 

    x = atoi(input); 

Avez-vous expext vraiment que l'attribution d'une nouvelle valeur à la variable x va redimensionner la variable array déjà déclarée ???

Non, vous devez déclarer le tableau lorsque sa taille est connue.

int x; 

    // ..... 

    x = atoi(input); 

    int array[x]; 

Ou, mieux encore, d'allouer un nouveau tableau à partir d'un tas, esp. quand x va obtenir grande valeur une journée ...

int arraylength; 

    // ..... 

    arraylength = atoi(input); 

    if (arraylength > 0)  // sanity check 
    { 
     int* array = malloc (arraylength * sizeof(int)); 
     if (array != NULL) // allocation succeeded 
     { 
      // use array[i]... 

      // and relese the array when no longer needed 
      free (array); 
     } 
    }