IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Impossible de faire un simple strcpy dans VS Community


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2020
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2020
    Messages : 88
    Par défaut Impossible de faire un simple strcpy dans VS Community
    Bonjour,

    Je me suis mis récemment sur l'IDE Visual Studio.
    J'ai repris les programmes que j'avais fait sur Code Block.
    Et là c'est le drame, je n'arrive pas à faire un simple strcpy() en langage C.
    J'ai le message d'erreur suivant :
    error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    Ci dessous mon code source (qui fonctionne sous Code Block) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    //Bibliothéques
    //=========================================================================
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //=========================================================================
     
    /*
    * FONCTIONS SUR LES STRINGS (CHAINE DE CARACTERES)
    ======================================================================================
    - strlen donne la taille de la chaine de caractere,
      ATTENTION, ne prends pas en compte le caractere fin de chaine = '\0'
     
    - strchr(chaine, char) retourne l'adresse (pointeur) du premier char trouvé dans la chaine
    	char c = 'o';
     
     - strcmp (chaine1, chaine2)
    	si chaine1 == chaine2 alors return 0
    	si chaine1 > chaine2 (APRES ordre alphabétique ) alors return +1
    	si chaine1 < chaine2 (AVANT ordre alphabétique ) alors return -1
     
    - strcpy(chaine1, chaine2) => copie chaine2 dans chaine1
    */
     
     
    // Fonction main (principale = point d'entré du programme)
    //=========================================================================
    int main(void)
    {
    	char chaine[] = "hello";
     
    	// strlen()
    	printf("La chaine est : %s\nSa taille est : %d\n", chaine, strlen(chaine));
     
    	// strchr()
    	char c = 'O';
    	char *p_char = strchr(chaine, c);
    	char *p_chaine = chaine;
    	int position = ((int)p_char) - ((int)p_chaine) + 1;
     
    	// Gestion de l'erreur (pointeur NULL)
    	// ========================================================================
    	if (p_char == NULL)
    		printf("Le char : %c n'est pas présent dans la chaine : \"%s\"\n", c, chaine);
     
    	else
    		printf("La chaine : %s\nLe caractere : %c\nLa position : %d\n", chaine, c, position);
    	// ========================================================================
     
    	// strcmp()
    	char chaine_test[] = "xhellO";
     
    	if (strcmp(chaine, chaine_test) == 0)
    		printf("Les chaines sont identiques");
     
    	else if (strcmp(chaine, chaine_test) == 1)
    		printf("%s > %s", chaine, chaine_test);
     
    	else if (strcmp(chaine, chaine_test) == -1)
    		printf("%s < %s", chaine, chaine_test);
     
    	// strcpy(destination, source)
    	// ATTENTION AU DÉPASSEMENT DU TABLEAU POUR LA NOUVELLE CHAINE !
    	strcpy(chaine, "Hello");
    	printf("%s\n", chaine);
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    	/*
     
     
     
     
    		// - strcat(chaine1, chaine2) => concatene (colle de gauche à droite (chaine1chaine2)
    		//   ATTENTION AU DÉPASSEMENT DU TABLEAU POUR LA NOUVELLE CHAINE !
    		strcat(message, " word");
    		printf("message = %s\n", message);
     
     
    		// - long strtol(chaine, pt_fin, base) (string to long)
    		// Transformer une chaine de caractere representant un nombre en un vrai nombre
    		strtol("12345", NULL, 10); // => 12345 (le nombre)
    		strtol("12€", NULL, 10);   // => 12    (le nombre)
     
     
    		// - double strtod(chaine, pt_fin)
    		strtod("12.3", NULL);	// 12,3 (le nombre)
    		strtod("12.2€", NULL);	// 12,2 (le nombre)
     
    		// - sprinf(message, chaine avec format, valeur format)
    		// écris dans message la chaine avec format
    		sprintf(message, "prix=%d€", 3);
     
    	*/
     
    	return 0;
    }

  2. #2
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 324
    Par défaut
    Ce n'est pas proposé dans le message d'erreur mais strcpy() peut être aisément remplacé par strncpy()... (dans le message d'erreur le compilo te propose une autre fonction... essaye de l'utiliser à la place de strcpy ^^ le compilo est ton ami)

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 726
    Par défaut
    C'est Microsoft qui veut qu'on utilise ses propres fonctions plus sécurisées : même si c'est le cas, ces fonctions ne sont pas portables.

    Avertissement du compilateur (niveau 3) C4996 (<- lien officiel)


    Édit : Ces fonctions XXX_s semblent être ajoutées avec le C11

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 525
    Par défaut
    oui il faut utiliser les fonctions sécurisées du runtime C/C++
    Dans le cas contraire si vous voulez distribuer l'exécutable compilé sur un autre poste,l'antivirus risque de marquer votre exe comme un faux positif

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 141
    Billets dans le blog
    4
    Par défaut
    C'est normalement un warning parce que tu utilises une fonction dépréciée (suffit de traduire le message), et tu as sûrement une option qui traite tous les warnings comme une erreur.
    Tu peux continuer d'utiliser ta fonction dépréciée en ajoutant le define (toujours en lisant le message d'erreur qui dit tout ça), en supprimant cette erreur avec pragma, ou utiliser strcpy_s qui est la version safe. Ou utiliser strncpy qui est il me semble standard.
    Les fonctions _s sont p-e spécifiques Windows, mais rien qu'une indirection ne puisse régler si tu compiles pour plusieurs plateformes.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2020
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2020
    Messages : 88
    Par défaut
    Bonsoir,

    Désolé de vous répondre si tard.
    Je vous remercie pour toutes vos précieuses réponses.
    Personnellement, j'ai lu dans le philosophie Linux qu'il vaut mieux privilégier la portabilité que l'efficacité.
    Ainsi j'ai opté pour désactiver l'erreur C4996.

    Pour désactiver cette erreur, (https://docs.microsoft.com/en-us/cpp...view=msvc-170)

    Dans un fichier :
    To turn off the warning within a file for everything that follows, use the warning pragma, #pragma warning(disable : 4996).
    Je n'ai pas compris ce qu'il faut faire.

    Dans un projet :
    To turn off the warning for an entire project in the Visual Studio IDE:
    Open the Property Pages dialog for your project. For information on how to use the Property Pages dialog, see Property Pages.
    Select the Configuration Properties > C/C++ > Advanced property page.
    Edit the Disable Specific Warnings property to add 4996. Choose OK to apply your changes.

    La j'ai compris.

    Pouvez vous me dire ce qu'il faut faire pour la désactiver cette erreur dans mon fichier ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 597
    Par défaut
    Ce qu'il faut faire t'est directement indiqué dans le warning, il faut ajouter avant tes includes la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define _CRT_SECURE_NO_WARNINGS

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2020
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2020
    Messages : 88
    Par défaut découpage du message
    Ok merci beaucoup je testerai la prochaine fois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2019, 18h40
  2. Réponses: 10
    Dernier message: 25/10/2016, 15h23
  3. Impossible de faire remonter une date dans un DTPicker
    Par MadeInSwiss dans le forum Excel
    Réponses: 4
    Dernier message: 11/10/2016, 10h12
  4. Faire un simple SELECT dans une Proc. Stock
    Par MaelstroeM dans le forum Oracle
    Réponses: 2
    Dernier message: 29/08/2007, 10h27
  5. Impossible de faire du pas à pas dans une dll
    Par denrette dans le forum Delphi
    Réponses: 5
    Dernier message: 18/12/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo