web-dev-qa-db-fra.com

Lire une chaîne en entrée à l'aide de scanf

Je suis nouveau dans le langage C et j'essaie de lire un caractère et une chaîne (une phrase; longueur max 25) d'un utilisateur.

Vous ne savez pas ce que je fais mal dans les lignes de code suivantes, cela me donne une erreur "Segment Fault".

#include <stdio.h>

int main(){
    char * str[25];
    char car;

    printf("Enter a character: ");
    car = getchar();

    printf("Enter a sentence: ");
    scanf("%[^\n]s", &str);

    printf("\nThe sentence is %s, and the character is %s\n", str, car);

    return 0;
}

Merci!

7
Hafiz Temuri

str est un tableau de 25 pointeurs vers char, pas un tableau de char. Alors changez sa déclaration en

char str[25];

Et vous ne pouvez pas utiliser scanf pour lire des phrases - cela arrête la lecture au premier espace, utilisez donc fgets pour lire la phrase à la place.

Et dans votre dernier printf, vous avez besoin du %c spécificateur pour imprimer les caractères, pas %s. Vous devez également vider l'entrée standard, car il y a un '\n' restant dans stdin, vous devez donc supprimer ces caractères.

Le programme révisé est maintenant

#include <stdio.h>    
void flush();
int main()
{
    char str[25], car;

    printf("Enter a character\n");
    car = getchar();

    flush();

    printf("Enter a sentence\n");
    fgets(str, 25, stdin);

    printf("\nThe sentence is %s, and the character is %c\n", str, car);

    return 0;
}
void flush()
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF)
        ;
}
7
Edward Karak

Vous devez apporter quatre modifications:

  1. Changement

    char * str[25];
    

    à

    char str[25];
    

    comme vous voulez un tableau de 25 chars, pas un tableau de 25 pointeurs vers char.

  2. Changement

    char car;
    

    à

    int car;
    

    as getchar() renvoie un int, pas un char.

  3. Changement

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

    à

    scanf( "%24[^\n]", str);
    

    qui dit à scanf de

    1. Ignorez tous les caractères d'espacement, le cas échéant.
    2. Scannez un maximum de 24 caractères (+1 pour le terminateur Nul '\0') Ou jusqu'à un \n Et stockez-le dans str.
  4. Changement

    printf("\nThe sentence is %s, and the character is %s\n", str, car);
    

    à

    printf("\nThe sentence is %s, and the character is %c\n", str, car);
    

    comme spécificateur de format correct pour un char est %c, pas %s.

10
Spikatrix