Posez votre question Signaler

Chaines de caractère(Langage C)

souzen 41Messages postés 12 octobre 2008Date d'inscription - Dernière réponse le 18 oct. 2008 à 22:55
Bonjour,
s'il vous plait comment peut on ecrire un partie de programme qui insère le caractère 's' au début d'une chaine dde caractère dans le langage C
Lire la suite 

Chaines de caractère(Langage C) »

9 réponses
Réponse
+3
moins plus
Si tu veux une version sécurisée (mais plus compliquée ^^), en voici une :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *concat(char *buf,size_t sz, char a){
    char *res=malloc(1+strlen(buf));
    res[0]=a;
    strncpy(res+1,buf,sz);
    return res;
}

int main(void){
    char buf[]="oucou";
    char *res;
    res=concat(buf,sizeof(buf),'c');
    printf("%s\n",res);
    return 0;
}

Remarque : je n'ai pas utilisé strcat, car tu as demandé concaténation d'un char et d'une chaîne de caractères ;)
Cdlt
Ajouter un commentaire
Réponse
+1
moins plus
Alors, pour ma part je vais te montrer une autre fonction qui est très utile pour les chaînes de caractères, c'est fgets/gets.

Voilà un code que j'ai tapé juste pour le fun et pour m'entraîner aux chaînes de caractères, je reconnais avoir mis beaucoup de temps avant d'arriver à un résultat correct !
Il est bourré de commentaires, prenez-le et copiez-le dans votre environnement de développement pour bien comprendre ;)

Bonne prog !


/*Auteur : Yuki
  But de ce programme : Demander à l'utilisateur de rentrer des informations et demander s'il est d'accord ou non avec
  ce qu'il a rentré, puis les afficher sans rencontrer les difficultés suivantes : 
           - Effacement de la chaîne dans la mémoire,
           - Non-prise en compte de l'espace avec scanf,
           - Eviter de stocker l'"Entree" dans la chaine,
           - Nettoyer le buffer (mémoire tampon).
           
___________________________________________________________________________________________________________________________*/


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*La biliothèque string est nécessaire pour quelques fonctions ci-dessous.*/

using namespace std;



static void search(char *chaine);
/*Où est l'intérêt de cette fonction search? On va y venir durant le programme et la fonction main !

____________________________________________________________________________________________________________________________*/


int main(int argc, char *argv[])
{
      char util[100], adversaire[100], OHV[100]; 
/*Primo : les chaines de caractères sont des tableaux de char ! Grosso modo, retiens que tu vas mettre dans le tableau 
le nombre de caractères que tu vas y entrer :) */

      char choix;    /*Un choix de l'utilisateur : a-t-il ou non rentré la bonne chaîne ?*/                         
      
  do{      /*Boucle do...while classique : on répète la question tant qu'il n'est pas d'accord avec ce qu'il a rentré*/
  
      printf("\nComment vous appelez-vous?\t");
      fgets(util, sizeof util, stdin);         /* fgets au lieu de scanf */
      
/*FONCTIONNEMENT DE FGETS : fgets(nom de la variable, taille de la variable, endroit où est stocké l'info
A noter que stdin correspond au buffer/mémoire tampon, c'est à dire là où vont les infos que l'on tape avec un scanf ou un fgets!*/
  
      search(util);                                         
      printf("\nVous vous appelez donc %s ? (O=Oui, N=Non)\t", util);
      scanf("%c", &choix);
      fflush(stdin);
            if(choix=='O' && choix!='N')
            {
            printf("\nD'accord, votre nom est donc ");
            }
     }while(choix=='N');                      
    printf("%s !\n\n", util);
          fflush(stdin); 
                    
/*Première partie achevée : on a demandé à l'utilisateur son nom et on l'a renvoyé à l'écran.
_______________________________________________________________________________________________________________________*/


    do{
        printf("\nLe nom de votre rival?\t\t");
        fgets(adversaire, sizeof adversaire, stdin);
        search(adversaire);
        printf("\nVotre rival est donc %s ? (O=Oui, N=Non)\t", adversaire);
        scanf("%c", &choix);
        fflush(stdin);
              if(choix=='O' && choix!='N')
              {
              printf("\nAh mais oui, c'est ");
              }
       }while(choix=='N');
    printf("%s votre rival!\n\n", adversaire);
          fflush(stdin); 
          
          
/*_______________________________________________________________________________________________________________________*/         

    do{
        printf("\nEt ou habitez-vous?\t\t");
        fgets(OHV, sizeof OHV, stdin);
        search(OHV);
        printf("\nVous habitez donc a %s ? (O=Oui, N=Non) ?\t", OHV);
        scanf("%c", &choix);
        fflush(stdin);
              if(choix=='O' && choix!='N')
              {
              printf("\nVous etes donc ");
              }
        }while(choix=='N');
    printf("%s, de %s !\n\n\n", util, OHV);
          fflush(stdin); 
    system("PAUSE");
    return 0;
}




/*Ici, le programme est terminé, mais on doit toujours faire appel à une fonction "search", la voici : */


static void search(char *chaine)

/*En fait, cette fonction sert à ne pas prendre en compte le "retour chariot" (le fait d'appuyer sur Entrée) que l'utilisateur
fait lorsqu'il rentre sa chaine.
En effet, fgets est tellement efficace qu'elle prend tout en compte... Même les entrées !*/

{
    char *p = strchr(chaine, '\n');

    if (p)
    {
        *p = 0;
    }
}


/*_______________________________________________________________________________________________________________________

Deux conseils : pour vérifier l'utilité des fonctions suivantes, retirez-les du programme pour voir ce qui va se passer !
              - fflush(stdin) : lavement du buffer, sans cela on conserve la variable "choix" tout juste entrée dedans et la 
nouvelle variable relative à l'utilisateur est "sautée".
              - search() : sans cela, on va avoir un petit problème, à vous de retirer cette fonction aussi pour vérifier ! ;)
              
  Bonne Prog !*/
lami20j- 18 oct. 2008 à 10:48
Salut,

using namespace std; ce n'est pas du C mais du C++
inutile vu que tu as la directive #include <stdio.h>
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,
Juste pour t'aider car cela fait pas mal de temps que je n'ai pas développé en C.
Peut-être ceci pourrait t'aider :

  #include <stdio.h>
  #include <string.h>
  main()
  {
    char ch1[50] = "s" ;
    char *ch2     = "bonjour" ;
    strcat("s" ,ch2);
    printf("Résultat :%s\n" ,ch1);
 }
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

avec la classique boucle for sans utiliser ni strcat, ni strncpy
#include<stdio.h>
#include<stdlib.h>

void concatener_caractere (char c, char *source, char *dest, int taille);

int main ()
{
  char c;
  int taille;

  char *destination;
  char *source;

  printf ("Caractère? ");
  scanf ("%c", &c);
  printf ("Taille chaine source? ");
  scanf ("%d", &taille);

  source = malloc (taille);
  destination = malloc (taille + 1);

  printf ("Chaine source? ");
  scanf ("%s", source);

  concatener_caractere (c, source, destination, taille);

  printf ("%s\n%s\n", source, destination);
  return 0;
}

void concatener_caractere (char c, char *source, char *dest, int taille){
  int i;

  dest[0] = c;
  for (i = 1; i < taille + 1; ++i)
    dest[i] = source[i - 1];
}
Le résultat
lami20j@debian:~$ ./a.out
Caractère? A
Taille chaine source? 20
Chaine source? bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
Abbbbbbbbbbbbbbbbbbbb
fiddy- 18 oct. 2008 à 19:40
Je viens de relire ton code et le mien. Il y a un point commun. L'oubli de free ^^
Ajouter un commentaire
Réponse
+0
moins plus
Ouais au temps pour moi ^^
Ajouter un commentaire
Réponse
+0
moins plus
D'ailleurs, le fflush(stdin) ne devrait pas exister ;)
Ajouter un commentaire
Réponse
+0
moins plus
je vous remercie bcp pour votre aide
Ajouter un commentaire
Ce document intitulé « chaines de caractère(Langage C) » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?