CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Problème Strcat en c

News jeu

Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop

Voir
artesmes
artesmes
Niveau 5
24 octobre 2020 à 19:08:26

Bonjour à vous,
je n'arrive pas à concaténer les deux chaines de caractères qualifié comme char.
J'essaie ici de prélever uniquement "salu" dans "salutation".
Merci d'avance.

https://image.noelshack.com/fichiers/2020/43/6/1603559433-capture-d-ecran-2020-10-24-a-19-09-56.png

Message édité le 24 octobre 2020 à 19:10:55 par artesmes
Pseudo supprimé
Pseudo supprimé 24 octobre 2020 à 20:25:46

Salut,

Le 1er soucis c'est que tu n'as pas initialisé mot1, du coup son contenu de base est indéfini.
Le 2e soucis c'est que strcat ne permet pas de concaténer des caractères mais bien des chaines de caractères. Du coup quand tu fait strcat(mot1, &mot[i]), ce que tu ajoutes à mot1, ce n'est pas le caractère d'indice i de mot, mais bien toute la chaine de caractères qui commence à l'indice i de mot.

Tu pourrais par exemple procéder comme ça :

void verifieMot2(char mot[20], int posMot) {
    char mot1[20] = ""; // bien initialiser ta chaine
    for (int i = 0 ; i < posMot ; i++) {
        mot1[i] = mot[i]; // copier un par un les caractères à la main
    }
    mot1[posMot] = '\0'; // ne pas oublier d'ajouter le caractère nul pour terminer la chaine
    printf("%s", mot1);
}

A noter qu'il faudrait vérifier les paramètres donnés à la fonction pour s'assurer qu'on n'aille pas lire/écrire en dehors de la mémoire qui nous est allouée, ce qui n'est pas du tout le cas ici :noel:

Franklin05
Franklin05
Niveau 10
25 octobre 2020 à 01:44:06

Le 24 octobre 2020 à 20:25:46 Yllid a écrit :
Salut,

Le 1er soucis c'est que tu n'as pas initialisé mot1, du coup son contenu de base est indéfini.
Le 2e soucis c'est que strcat ne permet pas de concaténer des caractères mais bien des chaines de caractères. Du coup quand tu fait strcat(mot1, &mot[i]), ce que tu ajoutes à mot1, ce n'est pas le caractère d'indice i de mot, mais bien toute la chaine de caractères qui commence à l'indice i de mot.

Tu pourrais par exemple procéder comme ça :

void verifieMot2(char mot[20], int posMot) {
    char mot1[20] = ""; // bien initialiser ta chaine
    for (int i = 0 ; i < posMot ; i++) {
        mot1[i] = mot[i]; // copier un par un les caractères à la main
    }
    mot1[posMot] = '\0'; // ne pas oublier d'ajouter le caractère nul pour terminer la chaine
    printf("%s", mot1);
}

A noter qu'il faudrait vérifier les paramètres donnés à la fonction pour s'assurer qu'on n'aille pas lire/écrire en dehors de la mémoire qui nous est allouée, ce qui n'est pas du tout le cas ici :noel:

d'ailleurs dans la fonction " verifieMot 2 " on devrai pas faire

void verifieMot2 ( char mot[], int postMot )
au lieu de
void verifieMot2 ( char mot[20], int postMot )

? :( on donne pas la taille du tableau en parametre j'me trompe ou pas ?

Message édité le 25 octobre 2020 à 01:44:22 par Franklin05
Pseudo supprimé
Pseudo supprimé 25 octobre 2020 à 02:52:49

[01:44:06] <Franklin05>

Le 24 octobre 2020 à 20:25:46 Yllid a écrit :
Salut,

Le 1er soucis c'est que tu n'as pas initialisé mot1, du coup son contenu de base est indéfini.
Le 2e soucis c'est que strcat ne permet pas de concaténer des caractères mais bien des chaines de caractères. Du coup quand tu fait strcat(mot1, &mot[i]), ce que tu ajoutes à mot1, ce n'est pas le caractère d'indice i de mot, mais bien toute la chaine de caractères qui commence à l'indice i de mot.

Tu pourrais par exemple procéder comme ça :

void verifieMot2(char mot[20], int posMot) {
    char mot1[20] = ""; // bien initialiser ta chaine
    for (int i = 0 ; i < posMot ; i++) {
        mot1[i] = mot[i]; // copier un par un les caractères à la main
    }
    mot1[posMot] = '\0'; // ne pas oublier d'ajouter le caractère nul pour terminer la chaine
    printf("%s", mot1);
}

A noter qu'il faudrait vérifier les paramètres donnés à la fonction pour s'assurer qu'on n'aille pas lire/écrire en dehors de la mémoire qui nous est allouée, ce qui n'est pas du tout le cas ici :noel:

d'ailleurs dans la fonction " verifieMot 2 " on devrai pas faire

void verifieMot2 ( char mot[], int postMot )
au lieu de
void verifieMot2 ( char mot[20], int postMot )

? :( on donne pas la taille du tableau en parametre j'me trompe ou pas ?

Ah possible oui, ça fait un petit moment que j'ai plus fait de C, je me souviens plus parfaitement

artesmes
artesmes
Niveau 5
25 octobre 2020 à 06:39:42

Le 24 octobre 2020 à 20:25:46 Yllid a écrit :
Salut,

Le 1er soucis c'est que tu n'as pas initialisé mot1, du coup son contenu de base est indéfini.
Le 2e soucis c'est que strcat ne permet pas de concaténer des caractères mais bien des chaines de caractères. Du coup quand tu fait strcat(mot1, &mot[i]), ce que tu ajoutes à mot1, ce n'est pas le caractère d'indice i de mot, mais bien toute la chaine de caractères qui commence à l'indice i de mot.

Tu pourrais par exemple procéder comme ça :

void verifieMot2(char mot[20], int posMot) {
    char mot1[20] = ""; // bien initialiser ta chaine
    for (int i = 0 ; i < posMot ; i++) {
        mot1[i] = mot[i]; // copier un par un les caractères à la main
    }
    mot1[posMot] = '\0'; // ne pas oublier d'ajouter le caractère nul pour terminer la chaine
    printf("%s", mot1);
}

A noter qu'il faudrait vérifier les paramètres donnés à la fonction pour s'assurer qu'on n'aille pas lire/écrire en dehors de la mémoire qui nous est allouée, ce qui n'est pas du tout le cas ici :noel:

Super Merci Yllid !!! pour ton aide qui m'a été vraiment cruciale. Je galerais depuis vrmnt 2h pour trouver l'erreur.
Bonne journée à toi !

MrAnge
MrAnge
Niveau 10
25 octobre 2020 à 18:24:39

Le 25 octobre 2020 à 01:44:06 Franklin05 a écrit :

d'ailleurs dans la fonction " verifieMot 2 " on devrai pas faire

void verifieMot2 ( char mot[], int postMot )
au lieu de
void verifieMot2 ( char mot[20], int postMot )

? :( on donne pas la taille du tableau en parametre j'me trompe ou pas ?

Je pense même que le prototype devrait être :
verifieMot2 ( char *mot, int postMot)

ce qui permet de faire
char mot1[strlen(mot)];

et avec une vérif
intPos < strlen(mot) - 1 // -1 car strlen compte le \0 de mémoire

on peut vraiment gérer n'importe quelle chaine

Pseudo supprimé
Pseudo supprimé 25 octobre 2020 à 19:02:20

Pour le coup qu'on mette sous forme tableau ou pointeur ça change rien du tout ici, ça fonctionne exactement pareil. Par contre char mot1[strlen(mot)]; c'est pas possible, on peut pas utiliser de valeur calculée pour déclarer un tableau, c'est ici pour le coup qu'il faudrait utiliser un pointeur :

void verifieMot2(char mot[], int posMot) {
    if (posMot > strlen(mot))
        return;
    char* mot1 = (char*) malloc(posMot + 1);
    for (int i = 0 ; i < posMot ; i++) {
        mot1[i] = mot[i];
    }
    mot1[posMot] = '\0';
    printf("%s", mot1);
    free(mot1);
}

Et justement strlen compte pas le '\0', il faut donc le prendre en compte quand on alloue la mémoire. Du coup je sais pas si tu es familiarisé avec les pointeurs l'auteur, mais si c'est pas le cas ne fais pas attention à ce nouvel exemple, il vaut mieux savoir ce qu'on fait quand on en utilise sous peine de découvrir la joie des Segmentation faults :noel:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware