Est-il possible d'utiliser cette fonction avec un tableau de destination non déterminé?
Si oui, comment?
Sinon, quelle est la meilleure solution? Utiliser une boucle?
Est-il possible d'utiliser cette fonction avec un tableau de destination non déterminé?
Si oui, comment?
Sinon, quelle est la meilleure solution? Utiliser une boucle?
J'ai rien compris. Montre ce que tu veux faire.Envoyé par Lucky-94
Voici un exemple:Compilation: array size missing in 'str2'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /* Exemple */ # include <stdio.h> int main (void) { char str1[] = "Exemple", str2[]; printf("Avant copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); strcpy (str2, str1); printf("Apres copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); return 0; }
Avec:Sortie:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /* Exemple2 */ # include <stdio.h> int main (void) { char str1[] = "Exemple", str2[] = ""; printf("Avant copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); strcpy (str2, str1); printf("Apres copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); return 0; }
Avant copie de str1 dans str2:
str1 contient: Exemple
str2 contient:
Apres copie de str1 dans str2:
str1 contient: xemple
str2 contient: Exemple
Je pense que c'est ceci que tu désires.
Tu peux simplifier en cela.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char tableau[101] = {0}; strncpy (tableau, "coucou", sizeof (tableau) - 1);
Mais ATTENTION, cela ne sera fonctionnel qu'avec des tableaux définit comme dans l'exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2#define CopyString(dst,src) strncpy (dst, src, sizeof (dst) - 1)
J'espère avoir répondu à ta question.[/img]
Ça doit planter car tu recopies str1 dans str2 qui
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # include <stdio.h> int main (void) { char str1[] = "Exemple", str2[] = ""; printf("Avant copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); strcpy (str2, str1); printf("Apres copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); return 0; }
est trop courte, c'est une chaîne initialisée avec une chaîne de longueur 0, donc le compilo a réservé un seul octet pour elle.
est non modifiable, car les chaînes définies en dur se trouvent en principe dnas une zone non modifiable de la mémoire. Ça semble fonctionner peut-être mais le moins que l'on puisse dire est qu'il est faux et non portable.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
D'ailleur si tu prends
Tu risque d'etre surpris quand à la valeur de str3, dans le meilleur des cas ça va passer puis en release tu auras une erreur de segmentation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # include <stdio.h> int main (void) { char str1[] = "Exemple", str2[] = "", str3[] = "vive le jardinage";/***/ printf("Avant copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); strcpy (str2, str1); printf("Apres copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); printf("str3 contient: %s\n", str3);/***/ return 0; }
Bonjour,
Comment il fait le compilateur pour connaitre la taille de str2 ? au hasard ?Envoyé par Lucky-94
Dans ce cas, au moins le compilateur connait la taille à allouer pour str2 mais attention à la concordance des tailles lors de l'utilisation de strcpy!Envoyé par Lucky-94
cela s'appel un comportement indéfinie, tout est possible.Envoyé par ronan99999
Dans le cas d'une initialisation en dur, la zone est non modifiable, donc le strcpy plante.Envoyé par gege2061
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Je ne crois pas (je peut me tromper, bien sûr) :Envoyé par Trap D
la chaîne est recopiée dans s, qui au passage est un tableau de 8 char.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char s[] = "Bonjour";
Par contre avec :
Dans ce cas, l'adresse de la chaîne peut pointer sur une zone non modifiable de la manière.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char *s = "Bonjour";
il se pourrait (et quand je dis il se pourrait ...) bien que tu aies raison, je viens de tester, ça ne plante pas, j'ai confondus avec le char *
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Comme l'indique ton compilateur, il n'est pas possible de définir un tableau sans taille(ni de taille 0). Ce code n'a donc aucun sens. Si tu veux un tableau dynamique, tu l'alloues avec malloc() et tu stockes son adresse dans un pointeur du bon type.Envoyé par Lucky-94
Ce code est techniquement correct, mais le tableau défini a une taille de 1 char (ici, 0), soit une longueur de chaine utile de 0, ce qui n'est pas grand chose...Compilation: array size missing in 'str2'
Avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 /* Exemple2 */ # include <stdio.h> int main (void) { char str1[] = "Exemple", str2[] = "";
Vu la taille de str2, le comportement est indéfini.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 strcpy (str2, str1); }
Non un tableau de char est modifiable. Le problème, c'est la taille. (1, soit une charge utile de 0!)Envoyé par Trap D
C'est même certain, aucun doute là-dessus.Envoyé par Trap D
Je ne comprends pas trop ce que tu entends par "un tableau de char est modifiable" ?Envoyé par Emmanuel Delahaye
Tu peux modifier les données du tableau. Le problème est de ne pas aller modifier des trucs qui ne seraient pas dans le tableau.
D'accord à ce niveau là, mais le fait de dire qu'un tableau de char est modifiable m'a fait penser qu'il pouvait modifier la taille du tableau ce qui porte à confusion.
C'est pour cela que je voulais une explication afin de comprendre ce qu'il voulait dire.
Envoyé par swirtel
est un tableau de char. Il est modifiable. Je peux écrire dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char s[123];
est un tableau de char initialisé. Il est modifiable. Je peux écrire dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char s[] = "hello";
est un tableau de char initialisé. Il est non modifiable. Je ne peux pas écrire dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char const s[] = "hello";
est un pointeur sur une chaine. Cette chaine n'est pas modifiable. Pour le signifier au compilateur, il est préférable de le préciser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part char *s = "hello";
Code : Sélectionner tout - Visualiser dans une fenêtre à part char const *s = "hello";
Emmanuel, merci de l'explication, mais je précisais dans mon commentaire que je n'avais pas très bien compris le sens de "tableau modifiable".
Simple problème de compréhension.
Bonjour,
Je sais que ce fil commence à dater, mais j'y reviens tout de même.
J'ai bien lu vos réponses et essayé de comprendre.
Ce que je n'arrive pas à expliquer (ou comprendre) c'est pourquoi, par rapport à ce nouvel exemple (3)pourquoi, donc, dans l'exemple 2 l'utilisation de «*strcpy*» modifie mon tableau «*str1*» en lui ajoutant le caractère nul (\0)?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /* Exemple3 */ # include <stdio.h> int main (void) { char str1[] = "Exemple", str2[7]=""; printf("Avant copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); strcpy (str2, str1); printf("Apres copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); return 0; }
Ou plutôt, ce caractère nul devant être ajouté automatiquement à l'initialisation, pourquoi «*strcpy*» décale mon tableau «*str1*» d'un octet?
Sûrement une particularité de «*strcpy*» que je ne connais pas...
Merci.
Attention. La taille de str2 est de 7 char, soit 6 + 1 (le 0 final). La chaine "Exemple" fait 7 + 1, soit 8 char.Envoyé par Lucky-94
Ok.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 printf("Avant copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2);
Comportement indéterminé. La source est plus grande que la destination.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 strcpy (str2, str1);
A cause du comportement indéterminé, le reste n'a plus aucun sens. Il faut commencer par corriger le code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 printf("Apres copie de str1 dans str2:\n"); printf("str1 contient: %s\n", str1); printf("str2 contient: %s\n", str2); return 0; }
Partager