Chaines de caractère(Langage C)

Fermé
souzen Messages postés 41 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 5 janvier 2009 - 18 oct. 2008 à 01:28
souzen Messages postés 41 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 5 janvier 2009 - 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
A voir également:

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2008 à 01:59
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
3
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
18 oct. 2008 à 10:39
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 !*/
1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
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>
0
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
18 oct. 2008 à 01:43
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);
 }
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
18 oct. 2008 à 07:45
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2008 à 19:40
Je viens de relire ton code et le mien. Il y a un point commun. L'oubli de free ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
18 oct. 2008 à 10:50
Ouais au temps pour moi ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 oct. 2008 à 11:33
D'ailleurs, le fflush(stdin) ne devrait pas exister ;)
0
souzen Messages postés 41 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 5 janvier 2009 26
18 oct. 2008 à 22:55
je vous remercie bcp pour votre aide
0