[c] String

String [c] - C - Programmation

Marsh Posté le 03-12-2005 à 13:00:17    

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
 
 
 

Reply

Marsh Posté le 03-12-2005 à 13:00:17   

Reply

Marsh Posté le 03-12-2005 à 13:08:32    

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

Reply

Marsh Posté le 03-12-2005 à 13:18:33    

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

Reply

Marsh Posté le 03-12-2005 à 13:22:54    

strcat

Reply

Marsh Posté le 03-12-2005 à 13:35:21    

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 ?

Reply

Marsh Posté le 03-12-2005 à 13:49:12    

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. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-12-2005 à 13:50:32    

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)

Reply

Marsh Posté le 03-12-2005 à 13:50:44    

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

Reply

Marsh Posté le 03-12-2005 à 13:51:08    

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
Reply

Marsh Posté le 03-12-2005 à 13:52:31    

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. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-12-2005 à 13:52:31   

Reply

Marsh Posté le 03-12-2005 à 13:53:56    

ouai ouai

Reply

Marsh Posté le 03-12-2005 à 13:55:52    

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

Reply

Marsh Posté le 03-12-2005 à 13:57:26    

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é.

Reply

Marsh Posté le 03-12-2005 à 14:04:14    

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

Reply

Marsh Posté le 03-12-2005 à 14:10:30    

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. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-12-2005 à 14:11:08    

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. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-12-2005 à 14:24:14    

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.
 

Reply

Marsh Posté le 03-12-2005 à 14:31:32    

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

Reply

Marsh Posté le 03-12-2005 à 14:48:27    

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
Reply

Marsh Posté le 03-12-2005 à 15:54:28    

coolben a écrit :

Maintenant mon script marche


[:mlc]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-12-2005 à 16:28:42    

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/
Reply

Marsh Posté le 03-12-2005 à 16:30:09    

Emmanuel Delahaye a écrit :


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


Certaines personnes preferent avec ;)

Reply

Marsh Posté le 03-12-2005 à 16:44:01    

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/
Reply

Marsh Posté le 04-12-2005 à 00:16:41    

mdrrr
 
excusez moi pour tout ces abus de langage

Reply

Marsh Posté le 06-12-2005 à 10:39:26    

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

Reply

Marsh Posté le 06-12-2005 à 10:50:42    

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é...

Reply

Marsh Posté le 06-12-2005 à 11:02:39    

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

Reply

Marsh Posté le 06-12-2005 à 11:05:30    

caractere posant probleme ? pour qui ?

Reply

Marsh Posté le 06-12-2005 à 11:08:19    

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
Reply

Marsh Posté le 06-12-2005 à 11:09:35    

(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)

Reply

Marsh Posté le 06-12-2005 à 14:43:26    

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.

Reply

Marsh Posté le 06-12-2005 à 15:09:30    

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


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 06-12-2005 à 15:10:57    

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 \')

Reply

Marsh Posté le 06-12-2005 à 15:15:12    

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

Reply

Marsh Posté le 06-12-2005 à 15:41:39    

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 )-
Reply

Marsh Posté le 16-12-2005 à 23:04:30    

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

Reply

Marsh Posté le 16-12-2005 à 23:05:24    

strtol

Reply

Marsh Posté le 16-12-2005 à 23:15:17    

k&r

Reply

Marsh Posté le 17-12-2005 à 00:13:34    

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
Reply

Marsh Posté le 17-12-2005 à 00:56:01    

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 !!!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed