CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]Fonction scanf + espaces

MathieuN7
MathieuN7
Niveau 10
25 septembre 2004 à 15:54:28

Salut tout le monde,

J´ai un problème: j´utilise la fonction scanf, qui est censée récupérer le chemin d´un fichier entré par l´utilisateur. Le problème, c´est que sous Windows il peut y avoir des chemin avec des espaces! ex: \Program Files\
Et le chaine s´arrête au premier espace rencontré, ce qui fait que je ne peux pas récupérer le chemin entier.

ma ligne:
scanf("%s", path);

Auriez-vous une solution ( un paramètre à ajouter? ou autre?) ou une astuce pour faire ce que je veux?

Merci d´avance!

LGV
LGV
Niveau 28
25 septembre 2004 à 17:56:58

le plus simple c´est encore de parser ta chaine avec un tokenizer ( séparateur \), et de virer le dernier élement ( le nom du fichier quoi).

DasHuhn
DasHuhn
Niveau 10
25 septembre 2004 à 18:06:43

getchar() tant que ! = " \n" c´est possible non ?

dnob700
dnob700
Niveau 10
25 septembre 2004 à 18:08:25

tu utilise iostram.h et cin.getline

ou alors tu rentre les chemin au format MS dos ( nom court)

jarose
jarose
Niveau 10
25 septembre 2004 à 18:13:51

scanf ( "%[^\n]s", path);

Mais il est déconseillé d´utiliser scanf. Cette fonction ne fait aucune vérification sur la taille des zones mémoires qu´elle modifie.

Il faut utiliser fgets, qui elle s´arrête après les n caractères que tu auras spécifié.
Si tu veux lire toute la ligne, il suffit donc de vérifier si le dernier caractère est ´\n´, si non, tu continues à lire en concatenant ta chaine.

DasHuhn
DasHuhn
Niveau 10
25 septembre 2004 à 18:13:59

Pas sur que ça plaise à tout le monde d´entrer des ~1 en étant sur que c´est pas un 2 ou plus à chaque fois.

DasHuhn
DasHuhn
Niveau 10
25 septembre 2004 à 18:15:43

Ah oui avais oublié ça pour le scanf.

MathieuN7
MathieuN7
Niveau 10
25 septembre 2004 à 18:58:51

jcomprends pas trop tout ce que vous dites :s

DasHuhn
DasHuhn
Niveau 10
25 septembre 2004 à 19:21:45

Bon moi j´ai proposé la solution de tout faire au getchar(), ce qui donne, selon mes souvenirs :

while( ( c = getchar()) ! = " \n") {
path[i] = c;
i++;
}

dnob a proposé d´entrer le chemin dans le style DOS ( max 8 car. + 3 d´extensions, ce qui devient rapidement progra~1 pour Program Files, enfin je me comprends et tu devrais comprendre aussi, honte à toi)

et Jarose a donné la bonne solution en parlant des codes spéciaux qui peuvent être passés à scanf() puis il t´a mis en garde contre cette fonction.

dnob700
dnob700
Niveau 10
25 septembre 2004 à 21:44:14

j´ai aussi parlé de cin.getline si on s´autorise un peu de C++

MathieuN7
MathieuN7
Niveau 10
25 septembre 2004 à 22:35:51

oki, et le ! = ´\n´ c´est quand on appuie sur [Entrée] que ça se produit?

dnob700
dnob700
Niveau 10
25 septembre 2004 à 22:37:29

oui, c´est un code spécial en C qui représente la combinaison du caractère ascii 13 puis du caractère ascii 10

a savoir saut de ligne et retour chariot ( mais ça dépend peut-être des système) et donc c´est effectivement se qui est renvoyé par la touche enter.

MathieuN7
MathieuN7
Niveau 10
25 septembre 2004 à 22:39:25

ok! ben merci jvais essayer de coder ça proprement :)

MathieuN7
MathieuN7
Niveau 10
26 septembre 2004 à 00:53:25

bon ben proprement j´y suis pas arrivé, j´en ai pas encore les capacités... :snif:
Mais j´ai fait ça:

char *my_scanf()
{
int i = 0, j;
char *buffer = ( char *)calloc(sizeof ( char*), 500);
char *chaine;
while((buffer[i] = getchar()) ! = ´\n´)
++i;
chaine = ( char *)calloc(sizeof ( char*), i+1);
for(j = 0; j < i; chaine[j++] = *buffer++);
free(buffer);
return chaine;
}

Voilà si ça intéresse qqn...

Et puis aussi si vous voulez voir la source demandez la moi! :-))) mathieun7 AT free POINT fr

dnob700
dnob700
Niveau 10
26 septembre 2004 à 01:41:44

ça va pas du tout...

fait plutot ça, même si c´est pas parfait.

sinon, tu ne désaloue pas chaine, là, tu peut gérer la mémoire ailleur dans le programme.

void my_scanf(char* chaine)
{
int i = 0, j;
char *buffer = ( char *)calloc(sizeof ( char*), 500);
while((buffer[i] = getchar()) ! = ´\n´)
++i;
chaine = ( char *)calloc(sizeof ( char*), i+1);
for(j = 0; j < i; chaine[j++] = *buffer++);
free(buffer);
}

MathieuN7
MathieuN7
Niveau 10
26 septembre 2004 à 10:01:31

:doute:
Je ne vois pas ce qui change ici...
Quelle est la différence entre ton code et le mien? :question:

dnob700
dnob700
Niveau 10
26 septembre 2004 à 10:28:32

oups, t´as raiso, il aurait en plus fallu suprimer la ligne
chaine = ( char *)calloc(sizeof ( char*), i+1);

c´est à l´utilisateur d´allouer la chaine pas à la fonction.
Aucune fonction prédéfinie n´alloue de chaine.

En plus tu peut rjoutter une ariable qui renvoie le nombre d´octet écrit dans la chaine si tu veux.

MathieuN7
MathieuN7
Niveau 10
26 septembre 2004 à 10:34:20

:question:
Ben jsuis désolé mais je comprends pas :doute:

"c´est à l´utilisateur d´allouer la chaine pas à la fonction.
Aucune fonction prédéfinie n´alloue de chaine. "

Il existe malloc, calloc, realloc?

jarose
jarose
Niveau 10
26 septembre 2004 à 16:26:41

Ce qu´il voulait sûrement te dire, c´est de procéder de cette façon:

char *string = ( char *)malloc ( sizeof(char *));
my_scanf ( &);
/ / ici tu utilises string
free ( string);

. ..

void ( char **string) {
; / / ici tu travailles avec *string
}

Dans tout les cas, votre code est " bourrin".

jarose
jarose
Niveau 10
26 septembre 2004 à 16:27:24

void my_scanf ( char **string) . ..

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment