8
votes

Y a-t-il une autre façon de tronquer une chaîne?

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.

5 commentaires

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 :)


6 Réponses :


17
votes

Avec une chaîne de style C, vous pouvez simplement définir le caractère que vous souhaitez tronquer sur \ 0 .

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 ).


1 commentaires

+1 Bon tour. Strlen s'arrêtera sur la première instance de \ 0



2
votes

Donnez ceci un look: xxx


2 commentaires

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.



2
votes

Prendre votre dernière question en premier, garantissant une taille maximale est assez facile. Généralement, vous souhaitez utiliser fgets 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" ou "% 29 [^ \ n]" ). Notez la différence entre les deux: avec fgets Vous spécifiez la taille du tampon, mais avec scanf vous spécifiez une taille de tampon (c.-à-d. Le nombre maximum de caractères à lire ).

Quant à la première question: Oui, il y a généralement de meilleurs moyens. strncpy 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 comme il devrait être Soyez utile, il n'est presque jamais vraiment.

Je ferais probablement des choses un peu différemment. Une possibilité serait d'utiliser snaprintf , quelque chose comme: xxx


1 commentaires

Si Out_File_Name n'est pas un tableau, votre exemple ne fonctionne pas. snaprintf n'est pas c89



2
votes

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 xxx


0 commentaires

1
votes

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);  
}


1 commentaires

@ BillP3rd - Excologies Bill, vient de remarquer que nous avions des réponses similaires. J'aime mieux le vôtre, pas de soustraction. - Tchin Tchin :)



1
votes
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 );
}

0 commentaires