En C, un répertoire est créé comme ceci:
mkdir("hello");
mais que faire si nous ne connaissons pas le nom de ce répertoire (ou s'il est indiqué par l'utilisateur)? Comment pouvons-nous le définir sur un ordinateur? (% s ne fonctionne pas)
3 Réponses :
mkdir reçoit en paramètre le nom du répertoire que vous souhaitez créer. Voici la doc . Ainsi, vous pouvez définir une variable pour contenir votre dossier d'entrée et la passer à la fonction
char path[30] = "path.to.dir"; mkdir(path, 0700);
Il semble que cela ne couvre pas tout ce dont OP a besoin à propos de "% s ne fonctionne pas".
Notez que votre code ne sera pas (ne devrait pas) compiler - mkdir ()
prend deux arguments.
Ce que j'ai compris, c'est qu'il essayait d'utiliser mkdir comme nous utilisons printf et scanf, en remplaçant la valeur de% d par la valeur de la variable. Et j'ai aussi compris que sa question était liée à l'utilisation de variables dans un appel mkdir
J'ai fait ce code dans Windows VS. Il utilisait en effet une version obsolète de mkdir, vous avez donc raison. Je vais ajuster l'exemple
Notez le commentaire de Girouette - MS a une fonction mkdir ()
à un seul argument tandis que POSIX a le version à deux arguments. La plateforme n'était pas clairement identifiée - dans des circonstances différentes, nous pourrions avoir tous les deux raison.
@ MárioRoccoPettinati Je pense que la dépréciation est uniquement due à la convention de dénomination des fonctions de bibliothèque non standard, donc mkdir ()
est devenu _mkdir ()
.
Oui. Dans VS, le nom suggéré est maintenant _mkdir et il prend 1 paramètre. Dans POSIX, il en faut deux. Mais je suis d'accord avec vous tous sur le fait que nous avons besoin de plus de précisions dans la question
Créez simplement une variable de chaîne, stockez la chaîne dans cette variable (qu'elle provienne d'une entrée utilisateur ou qu'elle soit codée en dur), puis passez la variable à mkdir
.
int main() { char str[10]; scanf("%9s", str); mkdir(str, 0700); return 0; }
p >
Cela entraînera presque certainement un dépassement de capacité de la mémoire tampon.
Ce n'est pas tant la taille, mais que la longueur d 'entrée est illimitée.
Notez le commentaire de Girouette - MS a une fonction mkdir ()
à un seul argument tandis que POSIX a le version à deux arguments. La plateforme n'était pas clairement identifiée - dans des circonstances différentes, nous pourrions avoir tous les deux raison.
Je vous recommande d'utiliser snprintf
afin de pouvoir prendre n'importe quel type d'entrée.
#include <stdio.h> int main() { char name[50]; int i = 5; snprintf(name, 50, "dir.%i", 5); mkdir(name, 0700); }
@daryalife Si cette réponse résout votre problème, veuillez l'accepter.
Lorsque vous dites "
% s
ne fonctionne pas", que voulez-vous dire exactement? Essayez-vous de transmettre une chaîne de formatage avec celle-ci directement à la fonctionmkdir
?Notez que POSIX
mkdir ()
prend deux arguments - le nom du répertoire et un ensemble d'autorisations à lui attribuer, tel que modifié par le paramètreumask
.Votre mention de
% s
suggère que vous devriez peut-être utilisersnprintf ()
pour formater une chaîne contenant le nom du répertoire que vous souhaitez créer, puis vous le transmettez chaîne et le mode répertoire (par exemple0755
) à l'appel systèmemkdir ()
. Voir aussi Comment puis-je créer une arborescence de répertoires en C ++ - qui a une réponse qui est du code C qui peut également être compilé par C ++.@JonathanLeffler la version Visual C de
mkdir
et le plus récent_mkdir
ne prend qu'un seul argument, bien que MS prétende qu'il a quelque chose à voir avec Posix.@WeatherVane - intéressant. Heureusement, j'ai soigneusement identifié "POSIX
mkdir ()
", qui nécessite deux paramètres. Étant donné que MS a une version qui ne nécessite pas ces deux paramètres, je dois classer ces informations pour référence future, et peut-être que le code serait OK si la plate-forme était Windows ou suffisamment étroitement liée. Et la relation avec POSIX est extrêmement ténue car MS nécessite l'en-tête
qui ne fait pas partie de POSIX - l'en-tête POSIX pour la gestion des répertoires viaopendir ()
et al est
, et dans tous les casmkdir ()
est déclaré dans
.Plutôt qu'un mot inconnu, utilisez un mot aléatoire