Insert into with sprintf
Résolu/Fermé
A voir également:
- Sprintf sql
- Sql server recovery - Télécharger - Gestion de données
- Logiciel sql - Télécharger - Bases de données
- Sql pix - Forum Python
- Dupliquer une table sql ✓ - Forum Programmation
- Sql commence par ✓ - Forum Webmastering
3 réponses
yg_be
Messages postés
23356
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
Ambassadeur
1 554
28 juin 2022 à 16:07
28 juin 2022 à 16:07
bonjour,
peux-tu montrer le contenu de la variable query dans les deux cas?
peux-tu montrer le contenu de la variable query dans les deux cas?
Je m'excuse de ne pas avoir compris au début,
dans le cas de variable rien n'est affiché
dans le cas d'une chaîne, la requête est affichée:
dans le cas de variable rien n'est affiché
dans le cas d'une chaîne, la requête est affichée:
INSERT INTO pro (`id`, `nom`,`espece`, `sequence`,`simulation`,`inhibition`) VALUES ("example","example","example","example","example","example");
yg_be
Messages postés
23356
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 554
28 juin 2022 à 20:08
28 juin 2022 à 20:08
SI rien n'est affiché, cela signifie que quelque-chose ne se passe pas bien.
Essaie d'identifier quelle variable crée le souci, en essayant une à la fois, en vérifiant à quel moment la variable
Comme tu ne montres qu'une partie de ton code, difficile pour nous d'être plus précis.
Essaie d'identifier quelle variable crée le souci, en essayant une à la fois, en vérifiant à quel moment la variable
queryn'est pas correcte.
Comme tu ne montres qu'une partie de ton code, difficile pour nous d'être plus précis.
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié le 29 juin 2022 à 14:02
Modifié le 29 juin 2022 à 14:02
La source de ton problème est sans doutes dans la façon dont tu déclares les variables pour tes chaînes de caractères et la façon dont tu les initialises avec les chaînes concernées.
Tu déclares des pointeurs sur char (seq, name, id, espece). Pour les utiliser en relation avec des chaînes de caractères, ces variables ne peuvent donc contenir qu'une adresse vers une chaîne de caractères stockée quelque part en mémoire. Est-ce bien ce que tu fais ?
Par ailleurs, tu déclares deux tableaux de char comme ceci :
Cela n'a pas grand sens, car le compilateur ne peut déterminer la taille du tableau à la compilation. En compilant ceci, gcc émet un warning indiquant que cela sera compris comme une déclaration d'un tableau d'un (seul) char. Or, on voit que tu veux utiliser cela pour une chaîne de 181 char. Ce type est sans doutes erroné pour ce que tu fais (mais encore faudrait-il que tu nous montres ce que tu fais avec ces variables).
Tu déclares des pointeurs sur char (seq, name, id, espece). Pour les utiliser en relation avec des chaînes de caractères, ces variables ne peuvent donc contenir qu'une adresse vers une chaîne de caractères stockée quelque part en mémoire. Est-ce bien ce que tu fais ?
Par ailleurs, tu déclares deux tableaux de char comme ceci :
char simulationn[]; char inhibitionn[];
Cela n'a pas grand sens, car le compilateur ne peut déterminer la taille du tableau à la compilation. En compilant ceci, gcc émet un warning indiquant que cela sera compris comme une déclaration d'un tableau d'un (seul) char. Or, on voit que tu veux utiliser cela pour une chaîne de 181 char. Ce type est sans doutes erroné pour ce que tu fais (mais encore faudrait-il que tu nous montres ce que tu fais avec ces variables).
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
29 juin 2022 à 15:19
29 juin 2022 à 15:19
Voilà du code commenté avec des exemples, qui peuvent te servir à comprendre comment manipuler des chaînes en C.
donne :
snprintf() est utilisable avec un compilateur raisonnablement récent (intégré au C à partir de la norme C11).
https://en.cppreference.com/w/c/io/fprintf
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { /* cas 0 : s0 est un pointeur sur char. On peut utiliser cette * variable pour stocker l'adresse d'une zone mémoire contenant * des char. Ce pointeur n'est pas initialisé à ce stade et * peut contenir n'importe quoi. Pour l'utiliser, il faudra y * mettre une adresse valide */ char * s0; /* cas 1 : s1 est un pointeur sur char initialisé avec une adresse * vers une chaîne constante stockée "en dur" dans une partie non * modifiable de la mémoire gérée par le programme */ char * s1 = "abc"; /* cas 2 et 3 : s2 et s3 sont des tableaux de char, dont la taille * est déterminée par le compilateur à la compilation. Dans le cas * de s2, le compilateur détermine la taille comme étant 4, car on * veut y mettre 3 char + le caractère terminateur de chaîne '\0'. * s2 et s3 ont donc la même taille. Le contenu stocké dans ces 2 * tableaux peut être modifié par le programme, contrairement au * cas précédent. */ char s2[] = "123"; char s3[4] = "ghi"; /* disons que mon programme récupère une chaîne d'un utilisateur * stockée dans str */ char str[256] = "Alphabet de la lettre 'a' à 'i' : "; /* pour que cette chaîne soit accessible à partir de la variable * pointeur s0, je peux juste affecter à s0 l'adresse vers le premier * élément du tableau str */ s0 = str; /* si je veux plutôt copier cette chaîne pour en créer une copie dans * une nouvelle chaîne accessible par le pointeur s0. Il me faut donc * réserver un espace mémoire suffisant avec malloc, mettre l'adresse * de cet espace dans s0, puis effectuer cette copie avec strcpy() */ s0 = malloc(strlen(str) + 1); strcpy(s0, str); /* si je veux copier une autre chaîne de 3 caractères dans le tableau * s2, je peux le faire avec strcpy(), et il y a assez de place pour * ce que je veux y mettre */ strcpy(s2, "def"); /* maintenant, disons que je veux concaténer s0, s1, s2 et s3 dans * une nouvelle chaîne stockée dans tableau pour lequel on est sûr * qu'il sera suffisamment grand */ char bigstr[3000]; sprintf(bigstr, "%s%s%s%s", s0, s1, s2, s3); printf("%s\n", bigstr); /* plutôt que d'utiliser un grand tableau, on aurait pu calculer la * taille des différentes chaînes avec strlen() et les additionner, * ou mieux, utiliser snprintf() pour le calculer pour nous (en lui * passant NULL et une taille de 0, comme ci-après et ensuite allouer * la mémoire suffisante avec malloc() */ size_t sufficientstr_size = snprintf(NULL, 0, "%s%s%s%s", s0, s1, s2, s3); char * sufficientstr = malloc(sufficientstr_size + 1); snprintf(sufficientstr, sufficientstr_size + 1, "%s%s%s%s", s0, s1, s2, s3); printf("%s\n", sufficientstr); /* on n'oublie pas de libérer la mémoire allouée, quand elle ne sert * plus */ free(sufficientstr); free(s0); return 0; }
donne :
$ gcc -Wall -Wextra 37625959.c
$ ./a.out
Alphabet de la lettre 'a' à 'i' : abcdefghi
Alphabet de la lettre 'a' à 'i' : abcdefghi
snprintf() est utilisable avec un compilateur raisonnablement récent (intégré au C à partir de la norme C11).
https://en.cppreference.com/w/c/io/fprintf
Modifié le 29 juin 2022 à 15:38
En cas de chaîne de caractère, je mets tout simplement :
Le cas des variables le contenu de query est:
où :
28 juin 2022 à 18:01
28 juin 2022 à 19:12
Modifié le 28 juin 2022 à 19:23
après ton sprintf() pour afficher ce que contient query, de faire cela dans les 2 cas (cas où cela "marche" et cas où cela ne "marche pas"), et de poster sur le forum ce qui est affiché.