2010-01-26 2 views
0

J'ai le code suivant:Besoin d'écrire sur une chaîne de caractères constante, comment puis-je contourner cela?

int main() { 
    char *sPPhrase[51]; 

    /* Input */ 
    printf("Enter string (max. 50 chars):\n"); 
    fflush(stdout);       /* Works around an annoying Eclipse bug that fails to display the output from the printf command */ 
    scanf("%s", *sPPhrase); /* Won't work */ 

    /* More code goes here */ 
} 

La commande scanf() échoue, je suppose, parce que * sPPhrase n'est pas inscriptible en tant que points sPPhrase à une chaîne constante. Le compilateur n'a aucune idée de quoi que ce soit qui ne va pas. Un peu plus tard, je dois transmettre cette chaîne à cette fonction:

char* reverse(char* sPPhrase[]);

La chaîne est pas accessible en écriture constante, mais je dois passer ce char * à cette fonction. Comment réécrire mon code pour le faire fonctionner?

Répondre

6

Vous déclarez un tableau de pointeurs, pas un tableau de caractères (couramment utilisé comme chaîne).

Vous devez déclarer comme ceci:

char sPPhase[51]; 

En outre, sscanf peut vous causer des ennuis: il est préférable d'utiliser fgets pour lire une chaîne dans un tampon borné:

int main() { 
    char sPPhrase[51]; 
    printf("Enter string (max. 50 chars):\n"); 
    fflush(stdout); 
    fgets(sPPhrase, 50, stdin); // leave one byte for '\0' 

    // More code 
} 

Je don sais pas ce que « inverse » est en train de faire, mais vous devriez probablement définir comme:

char* reverse(char* sPPhrase); 

Si elle fait l'opéra En place, vous n'avez même pas besoin d'une valeur de retour. Si vous le faites, n'oubliez pas de le libérer lorsque vous avez terminé.

+0

Et changer scanf en scanf ("% s", sPPhrase); –

+0

Également besoin de mettre à jour le scanf à scanf ("% s", sPPhrase) – zebrabox

+0

Alors comment appeler la fonction?'char * sPReverse = reverse (sPPhrase);' génère cette erreur: "en passant arg 1 de' reverse 'd'un type de pointeur incompatible " – Pieter

0

Votre decaration de sPPhase:

char *sPPhrase[51]; 

est en fait un tableau de 51 pointeurs. Qu'est-ce que vous voulez réellement est juste un tableau de caractères:

char sPPhrase[51]; 

Quand vous faites cela, vous devez changer le scanf

scanf("%s",sPPhrase) 

Notez également que votre scanf peut lire plus que prévu.

0

Pour comprendre cela, vous devez revenir à la façon dont les tableaux sont implémentés en mémoire. char* sPPhrase[51]; est une déclaration d'un pointeur vers des pointeurs, que vous pouvez considérer comme similaire à un tableau bidimensionnel. Si vous le déclarez et appelez scanf pour le lire, vous définissez la valeur d'un tableau entier égal à un caractère. Cela revient à dire:

char chars2D[50][50]; 
chars2D[0] = 'A'; 

Ce que cela fait est la fixation d'un tableau entier égal à « A », de sorte que l'adresse mémoire du tableau est « A ». Ceci est une valeur de mémoire dans la mémoire. Lorsque vous appelez scanf("%s", *sPPhrase);, vous ne faites que multiplier le problème en essayant de définir le haut de chaque tableau égal à une lettre. Donc, vous obtenez des ordures.

Here est un fil décrivant comment utiliser scanf pour lire dans un tableau de caractères.

Questions connexes