Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2120 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [c] String

 



 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[c] String

n°1258040
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 13:00:17  profilanswer
 

Bonjour
 
 
Depuis hier soir je cherche  faire des chaines de caractere en c en vain.
De plus je ne comprend pas comment faire pour declarer un type string alors que j'utilise la bibliotheque string.h .
 
Je sais que l'on peut faire ca :

Code :
  1. char chaine[5]:
  2. toto[0]='t';
  3. toto[1]='o';
  4. toto[2]='t';
  5. toto[3]='o';
  6. toto[4]='\0';


mais c'est un peu lourd
j'aimerai un truc du genre :  
string chaine;
chaine = "toto";
 
merci d'avance
 
 
 

mood
Publicité
Posté le 03-12-2005 à 13:00:17  profilanswer
 

n°1258042
chrisbk
-
Posté le 03-12-2005 à 13:08:32  profilanswer
 

houla. Bin en C, une chaine c'est char *. Y'a pas de type string de base.
 
genre
 
char *prout = "prout";
 

n°1258044
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 13:18:33  profilanswer
 

merci c'est niquel!
et sans vouloir abuser , pour concatener deux chaine c'est quoi ?
J'ai deja essayer . & + mais ca ne marche pas .

n°1258048
Joel F
Real men use unique_ptr
Posté le 03-12-2005 à 13:22:54  profilanswer
 

strcat

n°1258056
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 13:35:21  profilanswer
 

Ca me fait une erreur de segmentation :
 

Code :
  1. coolben@debian-P4m:~/projet$ more test2.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. int main(int argc, char*argv[])
  7.    {
  8. char *test;
  9. char *chaine;
  10. chaine = "chaine";
  11. test = "toto";
  12. test = strcat(test,chaine);
  13. fprintf(stdout,"chaine:%s \ntest:%s\n",chaine,test);
  14. return(0);
  15. }
  16. coolben@debian-P4m:~/projet$ cc test2.c
  17. coolben@debian-P4m:~/projet$ ./a.out
  18. Erreur de segmentation
  19. coolben@debian-P4m:~/projet$


Faut pas declarer un espace memoir par hasard ?
un truc du style : using namespace ?

n°1258060
Dion
Acceuil
Posté le 03-12-2005 à 13:49:12  profilanswer
 

non, faut utiliser malloc
 
 
man 2 malloc


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Elmoricq 8->
n°1258062
Elmoricq
Modérateur
Posté le 03-12-2005 à 13:50:32  profilanswer
 

Il y a beaucoup de choses à t'expliquer je pense, le plus simple c'est de te dégoter un cours ou un tutorial.
 
Y en a plein un peu partout, mais tu peux commencer par là :
http://mapage.noos.fr/emdel/init_c.htm
 
(et using namespace, c'est du C++, pas du C)

n°1258063
l0ky
Posté le 03-12-2005 à 13:50:44  profilanswer
 

parce que tu essayes de mettre une "chaine" taille 11 dans une "chaine" de taille 7 [:roane]
lit  
man strcat

n°1258064
Elmoricq
Modérateur
Posté le 03-12-2005 à 13:51:08  profilanswer
 

l0ky a écrit :

parce que tu essayes de mettre une "chaine" taille 11 dans une "chaine" de taille 7 [:roane]
lit  
man strcat


 
Ses chaînes sont constantes de toute façon. Vaut mieux qu'il commence par apprendre les bases, ce sera plus rapide.


Message édité par Elmoricq le 03-12-2005 à 13:51:28
n°1258066
Dion
Acceuil
Posté le 03-12-2005 à 13:52:31  profilanswer
 

l0ky a écrit :

parce que tu essayes de mettre une "chaine" taille 11 dans une "chaine" de taille 7 [:roane]
lit  
man strcat


 
oue en fait elmo a raison, un tuto ca serait mieux
 
compile avec un gcc 2.9.truc.bidule.machin ca pete L13 :o


Message édité par Dion le 03-12-2005 à 13:53:49

---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Elmoricq 8->
mood
Publicité
Posté le 03-12-2005 à 13:52:31  profilanswer
 

n°1258067
l0ky
Posté le 03-12-2005 à 13:53:56  profilanswer
 

ouai ouai

n°1258068
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 13:55:52  profilanswer
 

Et ou faut il utiliser cette fonction ?
Es ce obligatoire ?
 
ceci retourne toujours la meme erreur :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. int main(int argc, char*argv[])
  6.    {
  7. char *test = malloc(128);
  8. char *chaine = malloc(128);
  9. chaine = "chaine";
  10. test = "toto";
  11. test = strcat(test,chaine);
  12. fprintf(stdout,"chaine:%s \ntest:%s\n",chaine,test);
  13. return(0);
  14. }


 
et c'est plutot cette commande pour afficher l'aide de malloc :
man 3 malloc
 
merci

n°1258069
Elmoricq
Modérateur
Posté le 03-12-2005 à 13:57:26  profilanswer
 

Je te dirais bien que ton malloc n'a servi à rien parce que tu as écrasé l'adresse allouée par ton affectation, mais je ne suis pas sûr que ça te parlera.
 
Lis le lien que je t'ai donné.

n°1258075
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 14:04:14  profilanswer
 

Si si  ca me parle  
je vais quand meme voir ce que ton lien mais j'ai deja fait du C du C++ mais y a longtemps.
une fois que mon probleme de concatenation sera resolu, je pense que tout ira bien.
 
C'est juste le debut qui est un peut laborieux

n°1258078
Dion
Acceuil
Posté le 03-12-2005 à 14:10:30  profilanswer
 

coolben a écrit :


et c'est plutot cette commande pour afficher l'aide de malloc :
man 3 malloc
 
merci


 
ciel, sauras tu me pardonner cette si grande erreur ?


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Elmoricq 8->
n°1258079
Dion
Acceuil
Posté le 03-12-2005 à 14:11:08  profilanswer
 

coolben a écrit :

Si si  ca me parle  
je vais quand meme voir ce que ton lien mais j'ai deja fait du C du C++ mais y a longtemps.
une fois que mon probleme de concatenation sera resolu, je pense que tout ira bien.
 
C'est juste le debut qui est un peut laborieux


 
je doute tres fortement la, parce que resoudre un probleme d'allocation memoire C avec des using namespace, c'est pas la reflexion de kk'un ki en a deja fait...


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Elmoricq 8->
n°1258084
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 14:24:14  profilanswer
 

oh oui je te pardonne.
J'ai plus mis la correction dans le but que si quelqu'un qui n'y connait rien essaye la commande puisse facilement avoir la bonne.
 
Par contre je me souvenait bien que c'etait en c++ et sous windows qu'il fallait declarer using namespace std en haut du fichier afin que les programmes fonctionne.
J'avoue que je melange maintenant un peu tout.
 
Par contre je ne comprend pas vraiment la fonction   malloc.
Pour moi elle libere un espace memoire d'une certaine taille pour une varible.
Et je pensait que si on alloue une donnée de taille plus petite dans cette variable, la taille de l'espace memoire reservé etait conservé et que par la suite on puisse mettre un donnée de taille plus grande que la premiere.
 

n°1258089
chrisbk
-
Posté le 03-12-2005 à 14:31:32  profilanswer
 

la on ne peut pas t'aider. IL y a trop a voir, trop a dire, trop a essayer par toi meme. Tu melanges tout, C/C++, memoire, domaine, bref c'est le delire complet. tu ne sais pas ce qu'est un pointeur, une zone memoire...
 
C'est pas une tarre, c'est pas un reproche, mais franchement il te faut lire des livres / doc sur le net, y aller lentement, pas a pas, comprendre chaque etape. Tu pars de 0 (comme nous tous a un moment) il te faudra donc un certain investissement personnel pour comprendre ce qu'il se passe

n°1258094
coolben
http://www.starbusiness.fr
Posté le 03-12-2005 à 14:48:27  profilanswer
 

effectivement je melangais bien tout et surtout les pointeurs et leur affectation.
Maintenant mon script marche :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. int main(int argc, char*argv[])
  7.    {
  8. char *test;
  9. char *chaine;
  10. char *res;
  11. fprintf(stdout,"debut de programme\n" );
  12. test = "hello";
  13. chaine = "world";
  14. fprintf(stdout,"chaine:%s \ntest:%s\n",chaine,test);
  15. res=malloc(strlen(test)+strlen(chaine)+2);
  16. strcpy(res,test);
  17. fprintf(stdout,"res:%s \n",res);
  18. strcat(res," " );
  19. fprintf(stdout,"res:%s \n",res);
  20. strcat(res,chaine);
  21. fprintf(stdout,"res:%s \n",res);
  22. return(0);
  23. }


 
Let's to code
 
et j'oubliait, Merci a tout le monde

Message cité 2 fois
Message édité par coolben le 03-12-2005 à 14:49:09
n°1258121
sircam
I Like Trains
Posté le 03-12-2005 à 15:54:28  profilanswer
 

coolben a écrit :

Maintenant mon script marche


[:mlc]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1258132
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-12-2005 à 16:28:42  profilanswer
 

coolben a écrit :

effectivement je melangais bien tout et surtout les pointeurs et leur affectation.
Maintenant mon script marche :<...>


  • C'est pas un 'script', mais un code ou un programme source...
  • #include <unistd.h> n'est pas standard et ne sert à rien ici.
  • #include <stddef.h> ne sert à rien ici.
  • Les paramètres de main() ne sont pas utilisés
  • Les chaines étant non modifiables, il est conseillé de les définir avec le qualificateur 'const'.
  • 'fprintf(stdout,' est une façon compliquée d'écrire 'printf('
  • l'espace avant le \n n'apporte rien. Par contre, en mode debug, il est utile d'encadrer les chaines de ' '. Ca permet de visualiser les espaces...
  • malloc peut échouer. NULL signifie erreur d'allocation. Le dimensionnement est correct.
  • Ce qui a été alloué doit être libéré...


SYSALLOC Err: Not-matched list:
SYSALLOC Bloc 003D24E0 (12 bytes) malloc'ed at line 24 of 'main.c' not freed


  • return n'est pas une fonction. Les parenthèses sont inutiles.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main (void)
{
    char const *test = "hello";
    char const *chaine = "world";
     
    printf("chaine: '%s'\n"
           "test: '%s'\n"
           , chaine
           , test);
           
    {
        char *res = malloc (strlen (test) + strlen (chaine) + 2);
         
        if (res != NULL)
        {
            strcpy (res,test);
            printf ("res: '%s'\n", res);
             
            strcat (res," " );
            printf ("res: '%s'\n", res);
             
            strcat (res,chaine);
            printf ("res: '%s'\n", res);
             
            free (res), res = NULL;
        }
    }
    return 0;
}

Message cité 1 fois
Message édité par Emmanuel Delahaye le 03-12-2005 à 16:39:47

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1258134
Dion
Acceuil
Posté le 03-12-2005 à 16:30:09  profilanswer
 

Emmanuel Delahaye a écrit :


  • return n'est pas une fonction. Les parenthèses sont inutiles.


Certaines personnes preferent avec ;)

n°1258139
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-12-2005 à 16:44:01  profilanswer
 

Dion a écrit :

Certaines personnes preferent avec ;)


genre

  puts (("Hello world" ));


des fois qu'y en ait une qui pète... On est jamais trop prudent...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1258285
coolben
http://www.starbusiness.fr
Posté le 04-12-2005 à 00:16:41  profilanswer
 

mdrrr
 
excusez moi pour tout ces abus de langage

n°1259846
coolben
http://www.starbusiness.fr
Posté le 06-12-2005 à 10:39:26  profilanswer
 

Y a t il une fonction en c biensur, permettant de remplacer les caracteres risquant de poser probleme.
Je pense principalement à ceux-ci : \ / ' "
 
Sinon je pensait chercher un tel carractere avec strchr puis le modifier.  
merci

n°1259854
Sve@r
Posté le 06-12-2005 à 10:50:42  profilanswer
 

coolben a écrit :

Y a t il une fonction en c biensur, permettant de remplacer les caracteres risquant de poser probleme.
Je pense principalement à ceux-ci : \ / ' "
 
Sinon je pensait chercher un tel carractere avec strchr puis le modifier.  
merci


Si tu dois faire un remplacement de un pour un, alors une simple boucle avec un "while((pt=strchr(...)) != NULL) suffit.
Si du veux remplacer une sous-chaîne par une autre (évidemment pas de même tailles) alors ça devient plus compliqué...

n°1259861
coolben
http://www.starbusiness.fr
Posté le 06-12-2005 à 11:02:39  profilanswer
 

Mon cas correspond plus au deuxieme car je compte remplacer ' par '' et \ par \\

n°1259865
chrisbk
-
Posté le 06-12-2005 à 11:05:30  profilanswer
 

caractere posant probleme ? pour qui ?

n°1259870
Sve@r
Posté le 06-12-2005 à 11:08:19  profilanswer
 

coolben a écrit :

Mon cas correspond plus au deuxieme car je compte remplacer ' par '' et \ par \\


Alors tu crées une seconde chaîne (malloc => tu dois donc connaître sa taille finale) et tu y transfères la première.
La modification se fait durant le transfert...
 
[:aloy]' et " font tous deux un caractère...


Message édité par Sve@r le 06-12-2005 à 11:14:51
n°1259871
chrisbk
-
Posté le 06-12-2005 à 11:09:35  profilanswer
 

(psql (la lib a postgres) demande pour son 'escapage' une chaine destination de taille egale a deux fois la taille d'origine, c'est une maniere rapide de regler le probleme)

n°1260067
coolben
http://www.starbusiness.fr
Posté le 06-12-2005 à 14:43:26  profilanswer
 

J'entendait remplacer tout simple cote en doublant ce caratere.

Citation :

caractere posant probleme ? pour qui ?


ca pose probleme parce ma chaine doit etre elle meme incluse dans une autre chaine ou cette chaine est entourée par des simples cotes.  
le tout et pour realiser une requete sql pour MySQL.

n°1260117
blackgodde​ss
vive le troll !
Posté le 06-12-2005 à 15:09:30  profilanswer
 

mysql_escape_string de libmysql demande aussi une chaine destination pareille que ce que disait chrisbk plus haut


---------------
-( BlackGoddess )-
n°1260120
chrisbk
-
Posté le 06-12-2005 à 15:10:57  profilanswer
 

et vu qu'il veut passer sa chainea mysql, je lui recommande FORTEMENT d'utiliser mysql_escape_string plutot que de se bricoler un truc foireux a lui (paske l'echappement de quote en sql standart, me semble pas que ca soit \')

n°1260130
coolben
http://www.starbusiness.fr
Posté le 06-12-2005 à 15:15:12  profilanswer
 

Si a une belle fonction comme ca, je vais l'utiliser!

n°1260176
blackgodde​ss
vive le troll !
Posté le 06-12-2005 à 15:41:39  profilanswer
 

en sql standard me semble que c'est '' (doubler la quote)
avec mysql je sais plus.
mais me semble pas qu'il y ait que ca a "escaper"


---------------
-( BlackGoddess )-
n°1268792
coolben
http://www.starbusiness.fr
Posté le 16-12-2005 à 23:04:30  profilanswer
 

Encore un petit question :
Comment convertir un chaine de caractere en entier ?
 
J'aimerai en faite pouvoir passer en argument de mon programme un entier mais j'arrive pas a trouve une fonction qui me converti un char * en int  
 
merci encore pour votre aide

n°1268794
chrisbk
-
Posté le 16-12-2005 à 23:05:24  profilanswer
 

strtol

n°1268798
_darkalt3_
Proctopathe
Posté le 16-12-2005 à 23:15:17  profilanswer
 

k&r

n°1268820
Mackila
Posté le 17-12-2005 à 00:13:34  profilanswer
 

Emmanuel Delahaye a écrit :

genre

  puts (("Hello world" ));


des fois qu'y en ait une qui pète... On est jamais trop prudent...


 
Rigole pas j'ai déja fait ca, voulais faire une macro avec du printf dedans, et les ... des macros c'est spécial GCC (et j'avais du codewarrior).
 
Attendez que je la retrouve...
 
edit : trouvé :D
patapé hein  :)  
 

Code :
  1. // LOG()
  2. // Utilisation :
  3. // LOG((const char * format, ...)) ;
  4. // ATTENTION A LA DOUBLE PARENTHESES !!!
  5. #define LOG(args) do             \
  6. {                                \
  7. extern BYTE commandeEnCours ;\
  8. putstring("\rLog: " ) ;       \
  9. printf args ;                \
  10. fflush(stdout) ;             \
  11. putstring("\r\n" ) ;          \
  12. if ( !commandeEnCours )      \
  13. {                            \
  14.  putstring(">" ) ;         \
  15.  afficheBufferEntree() ;  \
  16. }                            \
  17. } while(0)


 
Utilisation typique :

Code :
  1. LOG(("free_HC_TD() : descripteur incorrect (index=%d, align=%d)", index, align)) ;


 
Bon d'accord je reconnais, ca fait bizarre, mais ca marche...

Message cité 2 fois
Message édité par Mackila le 17-12-2005 à 00:19:02
n°1268830
Sve@r
Posté le 17-12-2005 à 00:56:01  profilanswer
 

Mackila a écrit :

Rigole pas j'ai déja fait ca, voulais faire une macro avec du printf dedans, et les ... des macros c'est spécial GCC (et j'avais du codewarrior).
 
Attendez que je la retrouve...
 
edit : trouvé :D
patapé hein  :)  
 

Code :
  1. // LOG()
  2. // Utilisation :
  3. // LOG((const char * format, ...)) ;
  4. // ATTENTION A LA DOUBLE PARENTHESES !!!
  5. #define LOG(args) do             \
  6. {                                \
  7. extern BYTE commandeEnCours ;\
  8. putstring("\rLog: " ) ;       \
  9. printf args ;                \
  10. fflush(stdout) ;             \
  11. putstring("\r\n" ) ;          \
  12. if ( !commandeEnCours )      \
  13. {                            \
  14.  putstring(">" ) ;         \
  15.  afficheBufferEntree() ;  \
  16. }                            \
  17. } while(0)


 
Utilisation typique :

Code :
  1. LOG(("free_HC_TD() : descripteur incorrect (index=%d, align=%d)", index, align)) ;


 
Bon d'accord je reconnais, ca fait bizarre, mais ca marche...


 
Si tu mettais des parenthèses au "printf" t'aurais pas besoin d'en mettre des doubles lorsque t'appelles ta macro !!!

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [c] String

 

Sujets relatifs
[Pascal] Chaine de caractere (string)" dans un string
opération sur stringerreur de segmentation sur string
Extraire des int et des float d'un string [résolu][resolu][PHP] extraction d'un operateur dans une string
Comment raccourcir la string de 3 caractere ?std::string
convertir une string en integer[java][debutant] string vers date
Plus de sujets relatifs à : [c] String


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR