char out_file_name[30]; ogSize = strlen(FileName); //i.e. - FileName_anylength.log (always.log) ogSize -= strlen(IN_FILE_SUFFIX); //amount of chars before .log strncpy( out_file_name, FileName, ogSize ); //out_file_name now is FileName_anylength (without the .log) Is this the best way to do this? Also, how do I guard that ogSize doesn't happen to be more than 30 chars as it is coming from user input? Thank You.
6 Réponses :
Avec une chaîne de style C, vous pouvez simplement définir le caractère que vous souhaitez tronquer sur En ce qui concerne votre deuxième question, vous vérifiez essentiellement. Ou vous allouez autant de mémoire que nécessaire, en fonction de la taille de la chaîne (n'oubliez pas d'inclure la place pour ce \ 0 code>. p>
\ 0 code>). P>
+1 Bon tour. Strlen s'arrêtera sur la première instance de \ 0 code>
Donnez ceci un look:
STRUP n'est pas ansi c (no c89, no c99)
Il est suffisamment connu et standard d'être utilisé en toute sécurité dans la plupart des environnements: IEEE 1003.1, 2004 ( opengroup.org/onlinepubs/009695399/fonctions/strdup.html ); SVR4, 4.3BSD, POSIX.1-2001 ( Linux.die.net/man/3/strdup ) et Unix 98 ( MKSSoftware.com/docs/man3/ strdup.3.asp ). En outre, ma solution ne fait aucune hypothèse sur la longueur de la chaîne source et la préserve.
Prendre votre dernière question en premier, garantissant une taille maximale est assez facile. Généralement, vous souhaitez utiliser Quant à la première question: Oui, il y a généralement de meilleurs moyens. Je ferais probablement des choses un peu différemment. Une possibilité serait d'utiliser fgets code> pour lire la chaîne. Cela vous permet de spécifier une longueur maximale. Sinon, vous pouvez spécifier une taille maximale dans un format Scanf (par exemple,
"% 29s" code> ou
"% 29 [^ \ n]" code>). Notez la différence entre les deux: avec
fgets code> Vous spécifiez la taille du tampon, mais avec
scanf code> vous spécifiez une taille de tampon (c.-à-d. Le nombre maximum de caractères à lire ).
strncpy code> est une fonction étrange, écrite à l'origine pour un objectif assez spécifique et (pour être honnête) devrait probablement être supprimée de la bibliothèque standard, car pendant qu'il semble em> comme il devrait être Soyez utile, il n'est presque jamais vraiment. P>
snaprintf code>, quelque chose comme: p>
Si Out_File_Name n'est pas un tableau, votre exemple ne fonctionne pas. snaprintf n'est pas c89
Utilisez Fgets () pour lire la chaîne de l'utilisateur, de cette façon, vous pouvez spécifier une longueur maximale de la chaîne
Vous pouvez insérer une null dans la chaîne pour la raccourcir. Au-dessous de la fonction Strstr () est utilisé pour trouver l'adresse de la première occurrence de ".log". Après cela, vous pouvez soustraire les deux adresses les unes des autres pour connaître la longueur du nom et où insérer le null.
int main() { char suffix[] = ".log"; char filename[] = "FileName_anylength.log"; char* end_address = strstr(filename, suffix); filename[end_address-filename] = 0; printf("%s", filename); }
@ BillP3rd - Excologies Bill, vient de remarquer que nous avions des réponses similaires. J'aime mieux le vôtre, pas de soustraction. - Tchin Tchin :)
char out_file_name[30]; char *suffix=".log"; size_t IN_FILE_SUFFIX = strlen(suffix); /* also works, if suffix occurs more than 1 time or never ! */ if( strstr( out_file_name, suffix ) ) { char format[20]; sprintf( format, "%%.%ds", strlen(out_file_name) - IN_FILE_SUFFIX ); sprintf( out_file_name, format, out_file_name ); }
Vous voulez dire avant-dire? Ou extraction de chaîne? Tronquer?
Je pense que vous voulez dire "tronquer" (vous voulez supprimer des éléments de la fin de la chaîne, tronquer à une longueur plus courte, non?)
tronquer - c'est celui qui est celui. Merci. Désolé, l'anglais est ma langue maternelle .... Oui d'abord, c'est pourquoi c'est si mauvais.
Le code (peut-être qu'un exemple) suppose que l'entrée de l'utilisateur contient le suffixe de fichier. Ce n'est peut-être pas. Alors, envisagez de vérifier que la pièce étant tronquée est en réalité le suffixe. Edit: Ahh, maintenant je vois le commentaire dans votre code. :)
Si vous connaissez l'adresse de mémoire linéaire et que vous avez beaucoup de chance, vous pourriez atteindre et retirer le DIMM. Ça va tronquer Yer String plutôt bien :)