2010-08-30 2 views
3

Je compile une bibliothèque C sur mac os x. Quand j'ai tapé l'entrée et après avoir imprimé sur l'écran les données je ne vois pas quelque chose.Problème avec scanf() sur mac

char *path = NULL; 
peerdisplay = "Bob"; 
printf("Insert the full 'To' path: "); 
scanf(" %a[^\n]", &path); 
printf("A path: %s \n", &path); 
 

Quand je remplace le% par% s, l'impression ok, mais après la course, j'ai une erreur de segmentation. J'aime courir comme un script.

Répondre

2

% a est une extension non standard gnu spécifique aux balayages scanf. Que disent vos pages de manuel OS X à ce propos?

La bibliothèque GNU C supporte une extension non-standard qui provoque la bibliothèque pour allouer dynamiquement une chaîne de caractères d'une taille suffisante pour l'entrée cordes pour le% s et% a spécificateurs de conversion [plage]. Pour utiliser de cette fonctionnalité, spécifiez un modificateur de longueur (donc% as ou % a [plage]). L'appelant doit libérer (3) la chaîne renvoyée

^est-ce votre intention?

dans ce cas, sachez que

Le modificateur a n'est pas disponible si le programme est compilé avec gcc std = c99 ou -D_ISOC99_SOURCE gcc (sauf si _GNU_SOURCE est également spéci- fiée), Dans ce cas, le a est interprété comme un spécificateur pour les nombres à virgule flottante (voir ci-dessus).

2

Vous devez allouer de la mémoire pour le chemin. Il doit y avoir suffisamment de mémoire pour tous les octets qui seront entrés, plus l'octet de fin NULL.

1

Votre path est un pointeur nul, faites pointer vers une mémoire allouée suffisamment grande pour contenir la chaîne à lire et le caractère de fin null.

Vous ne devez pas passer adresse de path à scanf et printf, à la place passer path lui-même.

Puisque vous numérisez une chaîne %s utiliser au lieu de %a

1

Tout d'abord, si vous passez une valeur nulle dans scanf que vous faites ici, vous dire essentiellement la bibliothèque C pour copier ce que la chaîne est entré dans un espace nul (aka la première page de la mémoire, généralement protégé contre l'écriture pour cette raison). Deuxièmement,% a est censé correspondre à un nombre à virgule flottante, pas à une chaîne. Troisièmement, il peut être judicieux de lire la documentation d'une fonction de bibliothèque avant de l'appeler.