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 du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2020
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Avril 2020
    Messages : 88
    Points : 48
    Points
    48
    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 averti

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    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 éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2020
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Avril 2020
    Messages : 88
    Points : 48
    Points
    48
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    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 565
    Points : 7 648
    Points
    7 648
    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 du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2020
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Avril 2020
    Messages : 88
    Points : 48
    Points
    48
    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, 17h40
  2. Réponses: 10
    Dernier message: 25/10/2016, 14h23
  3. Impossible de faire remonter une date dans un DTPicker
    Par MadeInSwiss dans le forum Excel
    Réponses: 4
    Dernier message: 11/10/2016, 09h12
  4. Faire un simple SELECT dans une Proc. Stock
    Par MaelstroeM dans le forum Oracle
    Réponses: 2
    Dernier message: 29/08/2007, 09h27
  5. Impossible de faire du pas à pas dans une dll
    Par denrette dans le forum Delphi
    Réponses: 5
    Dernier message: 18/12/2006, 10h26

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