Chaines de caractère(Langage C)

souzen Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   -  
souzen Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   4
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Membre Dernière intervention   27
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   4
 
Ouais au temps pour moi ^^
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
D'ailleurs, le fflush(stdin) ne devrait pas exister ;)
0
souzen Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   26
 
je vous remercie bcp pour votre aide
0