Tableau à double dimension
Résolu/Fermé
CrazyGeekMan
Messages postés
873
Date d'inscription
dimanche 1 novembre 2015
Statut
Membre
Dernière intervention
26 novembre 2024
-
Modifié par CrazyGeekMan le 4/01/2017 à 11:48
CrazyGeekMan Messages postés 873 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 26 novembre 2024 - 4 janv. 2017 à 17:51
CrazyGeekMan Messages postés 873 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 26 novembre 2024 - 4 janv. 2017 à 17:51
A voir également:
- Tableau à double dimension
- Double ecran - Guide
- Tableau croisé dynamique - Guide
- Whatsapp double sim - Guide
- Tableau ascii - Guide
- Tableau word - Guide
2 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 4/01/2017 à 14:18
Modifié par [Dal] le 4/01/2017 à 14:18
Salut CrazyGeekMan,
en déclarant
une chaîne de caractères en C est un emplacement en mémoire où sont stockés des
https://www.commentcamarche.net/contents/118-langage-c-les-chaines-de-caracteres#qu-est-ce-qu-une-chaine-de-caracteres
ton tableau est donc mal déclaré et ta mémoire mal allouée si tu veux stocker autre chose que un
pour faire un tableau bidimensionnel de chaînes de caractères, tu dois mettre dans chaque case les pointeurs sur
à ce moment là, ton
Dal
charreprésente un caractère et non une chaîne de caractères
en déclarant
char mot[ligne][colonne];tu ne fais que réserver de l'espace pour un seul caractère dans chaque case de ton tableau bidimensionnel (un char étant en fait un type entier, l'entier étant normalement la représentation ASCII du caractère)
une chaîne de caractères en C est un emplacement en mémoire où sont stockés des
charet terminée par le caractère "null", soit
'\0':
https://www.commentcamarche.net/contents/118-langage-c-les-chaines-de-caracteres#qu-est-ce-qu-une-chaine-de-caracteres
ton tableau est donc mal déclaré et ta mémoire mal allouée si tu veux stocker autre chose que un
charpar case (et ton
scanf("%s",&mot[i][j]);va certainement écrire dans des zones mémoires non allouées, occasionnant une corruption de la mémoire, des core dumps,...)
pour faire un tableau bidimensionnel de chaînes de caractères, tu dois mettre dans chaque case les pointeurs sur
char, pointant vers la zone mémoire allouée à chaque chaîne que tu veux stocker. Si tu le fais au moyen de
malloc(), tu devras gérer aussi la libération de l'espace avec
free()...
à ce moment là, ton
printf("%s",mot[i][j]);sera également content et ne t'enverra plus de warning.
Dal
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
Modifié par jisisv le 4/01/2017 à 16:39
Modifié par jisisv le 4/01/2017 à 16:39
Ceci fonctionnera mieux et se rapprochera des standards:
Remarquons le caractère de formatage en ligne 29
-
Gates gave ^W sold you the windows.
GNU gave us the whole house.(Alexandrin)
#include <stdlib.h> #include <stdio.h> const unsigned int lignes = 2; const unsigned int colonnes = 3; int main(int argc, char *argv[]) { int i,j; // char vide; char mot[lignes][colonnes]; for(i = 0; i < lignes; i++) { for(j = 0; j < colonnes; j++) { printf("\n Rentre la valeur mot[%2d,%2d] \n",i,j); scanf("%c", &mot[i][j]); /* scanf("%c", &vide); */ } } for(i = 0; i < lignes; i++) { for(j = 0; j < colonnes; j++) { printf("%c", mot[i][j]); } } return EXIT_SUCCESS; }
Remarquons le caractère de formatage en ligne 29
123abcjohand@bata:~/src/Cgcc -Wall -o fill_tab fill_tab.cll_tab
johand@bata:~/src/CCM/C$ echo 123abc | ./fill_tab
Rentre la valeur mot[ 0, 0]
Rentre la valeur mot[ 0, 1]
Rentre la valeur mot[ 0, 2]
Rentre la valeur mot[ 1, 0]
Rentre la valeur mot[ 1, 1]
Rentre la valeur mot[ 1, 2]
123abc
-
Gates gave ^W sold you the windows.
GNU gave us the whole house.(Alexandrin)
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
4 janv. 2017 à 15:49
4 janv. 2017 à 15:49
salut jisisv,
Il me semble que notre ami veut stocker des chaînes de caractères dans son tableau à deux dimensions, et non un seul char.
Dal
Il me semble que notre ami veut stocker des chaînes de caractères dans son tableau à deux dimensions, et non un seul char.
Dal
CrazyGeekMan
Messages postés
873
Date d'inscription
dimanche 1 novembre 2015
Statut
Membre
Dernière intervention
26 novembre 2024
136
>
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
4 janv. 2017 à 17:24
4 janv. 2017 à 17:24
Oui c'est vrai.
Mais merci à vous, ces codes me permettent de mieux comprendre la structure du c ;)
Mais merci à vous, ces codes me permettent de mieux comprendre la structure du c ;)
Modifié par CrazyGeekMan le 4/01/2017 à 14:45
Et moi comme un con j'ai essayé de compiler avec l'option ...
Je ne vois pas ce que tu veut dire par "tu dois mettre dans chaque case les pointeurs sur char, pointant vers la zone mémoire allouée à chaque chaîne que tu veux stocker." :(
Je dois créer 6 pointeurs pointant vers 6 chaînes de caractères? (6 char?)
Désolé pour le boulet que je suis.
Modifié par [Dal] le 4/01/2017 à 16:22
il y a plusieurs façons de faire
par exemple, alternativement, tu peux tout faire avec des pointeurs et des allocations dynamiques, en déclarant ta structure de données comme étant un (c'est utile si le nombre de lignes et de colonnes, outre la taille des chaînes, sont indéterminés à l'avance ou peuvent varier en cours d'exécution)
si tu n'as pas besoin de tailles variables, tu peux aussi te passer des mallocs / free en déclarant un truc comme et c'est tout
Dal
P.S. : peut s'écrire aussi en C, car le type a, par définition, une taille de 1 byte
4 janv. 2017 à 17:13
Je vais encore étudié cette partie du code :
Il y a deux boucles while sans aucune instructions, je n'ai jamais vu ça ^^
Merci !
Modifié par [Dal] le 4/01/2017 à 17:53
si tu n'utilisais pas de malloc, je pense que tu veux dire "allocation statique"
pour :
1.
le premier while s'assure que scanf renvoie 1 (c'est à dire qu'il a pu capturer un élément provenant de stdin correspondant au masque demandé), le scanf étant dans le test du while, il n'y a rien d'autre à mettre à la suite, et le point virgule reporté en 2ème ligne (après le commentaire) est une façon de montrer à un lecteur du code que c'est intentionnel
pour le masque , il :
- consomme dans stdin tous les caractères jusqu'au retour à la ligne exclu (y compris les espaces ou tabulations)
- en ignorant les caractères au delà du 9ème
si vraiment tu ne prends en compte que des mots et que si l'utilisateur saisit des espaces, cela signifie qu'il a terminé son mot, tu peux faire et les espaces et les caractères qui suivent éventuellement ne seront pas capturés par scanf qui limitera sa capture à 9 caractères où les espaces ou tabulations sont interdits et en laissant dans le flux stdin le reste
2.
le 2ème while est une façon répandue de vider le flux stdin en C (contenue dans le test du while sur le même principe), pour retirer les caractères qui peuvent y être laissés par scanf (notamment '\n' et/ou dans notre cas tous caractères saisis dépassant la taille de 9 caractères), de façon à ce qu'ils ne viennent pas à être consommés par le prochain appel à scanf (ou une autre fonction exploitant le flux stdin)
4 janv. 2017 à 17:51
Ces bases m'aideront par la suite :)
Bonne soirée :)