2010-08-24 7 views
1

J'ai un tableau C appelé buf. Voici la définition de ce:Ajouter une chaîne au tableau de caractères dans C

char buf[1024];

Maintenant, mon code actuel prend de stdin et utilise fgets() pour définir ce tableau, mais je souhaite utiliser le code pour le mettre à la place. En ce moment, la ligne qui définit buf ressemble à ceci:

fgets(buf, 1024, stdin);

Fondamentalement, je veux remplacer stdin, par exemple ... « Ma chaîne ». Quelle est la meilleure façon de faire cela?

Répondre

6

Rechercher sprintf, par exemple ici: Cpp reference

Edit:

sprintf(buf, "My string with args %d", (long) my_double_variable); 

Edit 2:

Comme suggéré d'éviter le débordement (mais celui-ci est standard C) vous pouvez utiliser snprintf .

+1

Regardez sprintf_s pour sécuriser et éviter les attaques par débordement de buffer. – KLee1

+0

@ KLee1: Généralement bon conseil. Cependant, étant donné que la chaîne va être fournie à l'intérieur du code, pas un tampon fourni par l'utilisateur, une attaque de débordement de tampon semble improbable. – torak

+0

Yep qui l'a fait! Merci, utilisera également _s. Merci les gars! – skylerl

2
strcpy(buf, "My String"); 

Le compilateur de Microsoft inclut également une fonction strcpy_s, qui est une version "sûre" de strcpy. Il s'assure que vous ne dépasserez pas buf. Dans ce cas particulier, ce n'est probablement pas un problème, mais vous devriez savoir. Mais, sachez qu'il n'est disponible avec aucun autre compilateur, il ne peut donc pas être utilisé là où un portable est nécessaire.

strcpy_s(buf, sizeof(buf), "My String"); 
1

Il existe de nombreuses variantes, dont certains ont déjà été proposés, dont certains ne:

... 

char input[] = "My String"; 

strcpy(buf, input); 

strncpy(buf, input, sizeof(buf)); 

sscanf(input, "%s", buf); 

sprintf(buf, "%s", input); 

memcpy(buf, input, strlen(input)); 

... 

plupart d'entre eux ne sont pas certains/insécurité. Qu'est-ce exactement devrait être pris dépend sur ce que vous voulez vraiment faire dans votre code.

Cordialement

RBO

-1

verbeux mais sûr:

int copy_size = sizeof(buf) - 1 < strlen(MyString) ? sizeof(buf) - 1 : strlen(MyString); 
memset(buf, 0, copy_size + 1); 
memcpy(buf, MyString, copy_size); 
+0

c'est horrible. pourquoi mettez-vous tant de mémoire à zéro pour l'écraser avec memcpy? Regardez le strlcpy de BSD. –

4

snprintf est seulement c99 pas C89, sprintf_s/strcpy_s ne sont MSVC, non C89, pas C99.

char *mystr="come from stdin or file or ..."; 
char buf[1024]; 
... 
memset(buf,0,sizeof buf); 
strncpy(buf,mystr,(sizeof buf)-1); 

ou un tableau non:

#define BUFLEN 512 
char *mystr="come from stdin or file or ..."; 
char *buf; 
... 
char *buf=calloc(1,BUFLEN); 
strncpy(buf,mystr,BUFLEN-1); 

Il fonctionne sur tous les environnements C ANSI.

+0

+1 pour être compatible C89. – alternative

Questions connexes