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?
Version imprimable
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.Citation:
Envoyé par Lucky-94
Voici un exemple:Compilation: array size missing in 'str2'Code:
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:
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:
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:
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 quiCode:
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; }
:arrow: 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.
:arrow: 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.
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:
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 ?Citation:
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!Citation:
Envoyé par Lucky-94
cela s'appel un comportement indéfinie, tout est possible.Citation:
Envoyé par ronan99999
Dans le cas d'une initialisation en dur, la zone est non modifiable, donc le strcpy plante.Citation:
Envoyé par gege2061
Je ne crois pas (je peut me tromper, bien sûr) :Citation:
Envoyé par Trap D
la chaîne est recopiée dans s, qui au passage est un tableau de 8 char.Code: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:char *s = "Bonjour";
:oops: 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 *
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.Citation:
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...Citation:
Compilation: array size missing in 'str2'
Avec:Code:
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.Citation:
Code:
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!)Citation:
Envoyé par Trap D
C'est même certain, aucun doute là-dessus.Citation:
Envoyé par Trap D
Je ne comprends pas trop ce que tu entends par "un tableau de char est modifiable" ?Citation:
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.
Citation:
Envoyé par swirtel
est un tableau de char. Il est modifiable. Je peux écrire dedans.Code:char s[123];
est un tableau de char initialisé. Il est modifiable. Je peux écrire dedans.Code:char s[] = "hello";
est un tableau de char initialisé. Il est non modifiable. Je ne peux pas écrire dedans.Code: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:char *s = "hello";
Code: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:
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.Citation:
Envoyé par Lucky-94
Ok.Citation:
Code:
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.Citation:
Code:
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.Citation:
Code:
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; }