2012-07-04 6 views
0

J'essayais de résoudre une question sur une matrice 2-D, mais malheureusement, l'entrée matricielle donnait une erreur. C'est le code:Entrée dans un tableau 2D

int arr[4][4]; 
int r, c; 
scanf("%d", &r); 
scanf("%d", &c); 
int i, j; 
fflush(stdin); 
for(i = 0; i < r; i++) 
    for(j = 0; j < c; j++) 
     scanf("%d", &arr[i][j]); 

Lorsque j'exécute ceci, il faut une entrée supplémentaire.
Par exemple: si r = 2 et c = 2> alors il faut 6 entrées, puis se bloque. Que faire?

+1

Que fait votre code après les boucles? Il semble que l'entrée fonctionne correctement. –

+0

Je suis d'accord. Ce code ne fonctionnerait que comme prévu (tant que 'r' et' c' ne sont pas plus de 4). – netcoder

+0

quand 'r = 2 et c = 2', il ne devrait prendre que 4 nombres. Je ne vois aucun problème avec le segment de code que vous avez publié. Pouvez-vous poster le code complet? –

Répondre

1

Si r = 2 et c = 2, il exécute les 2 premiers scanf puis le balayage 2 x 2 de votre boucle 2D.

Cela fait 2 + 2x2 = 6.

Après la dernière scanf, si votre programme est terminé, il ferme tout simplement, c'est normal.

+1

Suis-je manquer quelque chose dans la question? –

0

Je pense que le problème avec votre code est que vous avez alloué une quantité fixe d'espace pour votre tableau, mais que l'utilisateur peut fournir un nombre arbitraire d'entrées en créant les limites r et c variables Ainsi, si l'utilisateur fournit r=6 et c=6, votre boucle tentera à un certain point de déréférencer arr[5][5], ce qui est invalide puisque vous avez défini int arr[4][4];. Si vous voulez permettre à l'utilisateur de créer autant de lignes et de colonnes comme ils veulent, vous devez initialiser arr avec l'entrée fournie par l'utilisateur, comme ceci:

int r,c; 
scanf("%d",&r); 
scanf("%d",&c); 
int arr[r][c]; 
+2

s'il n'utilise pas c99 fait – Aftnix

+1

@aftnix, je ne comprends pas ce que vous entendez par "tableaux de longueur variable pour la pile". S'il n'utilise pas C99, il ne peut pas utiliser de tableaux de longueur variable, car ils étaient une fonctionnalité introduite dans C99 La solution consiste à utiliser 'malloc' pour créer manuellement le tableau, comme expliqué [ici] (http://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444?pgno=1). – Edward

+3

Je soulignais simplement que s'il n'utilise pas c99, le tableau de longueur variable ne fonctionnera pas. – Aftnix

1

J'ai copié votre code et avons essayé d'exécuter et je observé qu'il montre le comportement indiqué par vous si nous prenons r et c supérieur à leurs limites. Donc, utilisez les bonnes limites.

-1

Dans votre code, vous avez simplement exécuté une boucle et la valeur de l'analyse dépend du nombre de boucles exécutées. Supposons que vous preniez r = 1, c = 1. Dans cette condition, pour toute valeur "r", c sera exécuté une seule fois. Donc, lorsque votre valeur sera plus grande que la taille du tableau cette fois, il vous donnera un comportement anormal.

si vous saisissez d'abord la valeur de "c" et "r" après quoi il se comportera normalement.

int r, c; 
scanf("%d", &r); 
scanf("%d", &c); 
int arr[r][c]; 
+0

Je ne vois pas comment cela est censé être une réponse à la question initiale. –

+0

Ce code va certainement fonctionner.Veuillez exécuter ce code. –

+0

Suppression de downvote ... vous avez probablement voulu montrer comment un tableau de taille personnalisée peut être alloué. Bien que ce ne soit pas une réponse réelle, elle contient des informations précieuses. –