web-dev-qa-db-fra.com

Lecture d'une chaîne à partir d'une entrée avec un caractère d'espacement?

J'utilise Ubuntu et j'utilise également Geany et CodeBlock comme IDE. Ce que j'essaie de faire, c'est de lire une chaîne (comme "Barack Obama") et de la placer dans une variable:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Your Name is: %s", name);

    return 0;
}

Sortie:

Enter your name: Barack Obama
Your Name is: Barack

Comment puis-je faire en sorte que le programme lise le nom complet?

92
Hieu Nguyen

Utilisation:

fgets (name, 100, stdin);

100 est la longueur maximale du tampon. Vous devriez l'ajuster selon vos besoins.

Utilisation:

scanf ("%[^\n]%*c", name);

Le [] est le caractère d'analyse. [^\n] indique que tant que l'entrée est , pas une nouvelle ligne ('\n') prend une entrée. Ensuite, avec le %*c, le caractère de nouvelle ligne est lu dans le tampon d'entrée (qui n'est pas lu), et le * indique que cette entrée lue est ignorée (suppression de l'assignation), car vous n'en avez pas besoin. , et cette nouvelle ligne dans le tampon ne crée aucun problème pour les prochaines entrées que vous pourriez prendre.

Lisez ici sur les opérateurs scanset et suppression des affectations .

Notez que vous pouvez également utiliser gets mais ....

Ne jamais utiliser gets(). Comme il est impossible de dire sans connaître à l'avance les données, combien de caractères seront lus (), et parce que gets() continuera à stocker les caractères après la fin de la mémoire tampon, son utilisation est extrêmement dangereuse. Il a été utilisé pour casser la sécurité informatique. Utilisez fgets() à la place.

164
phoxis

Essaye ça:

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

\n définit simplement le délimiteur pour la chaîne analysée.

21
Sridhar Iyer

Voici un exemple de la façon dont vous pouvez obtenir des entrées contenant des espaces en utilisant la fonction fgets.

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}
6
kyle k
scanf(" %[^\t\n]s",&str);

str est la variable dans laquelle vous obtenez la chaîne.

5
animesh

REMARQUE: lors de l'utilisation de fgets (), le dernier caractère du tableau sera '\ n' lorsque vous utilisez fgets () pour de petites entrées dans CLI (interpréteur de ligne de commande), lorsque vous terminez la chaîne avec 'Entrée'. Ainsi, lorsque vous imprimez la chaîne, le compilateur passe toujours à la ligne suivante lors de l'impression de la chaîne. Si vous voulez que la chaîne d'entrée ait une chaîne terminée par un caractère nul, comme le comportement, utilisez ce hack simple.

#include<stdio.h>
int main()
{
 int i,size;
 char a[100];
 fgets(a,100,stdin);;
 size = strlen(a);
 a[size-1]='\0';

return 0;
}

Mise à jour: mise à jour avec l'aide d'autres utilisateurs.

2
Ritesh Sharma
#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) { 
   str[i] = c;
   c = getchar();
   i++;
}
str[i] = '\0';
return i;
}
1
ayush bhorse
#include<stdio.h>
int main()
{
   char name[100];
   printf("Enter your name: ");
   scanf("%[^\n]s",name);
   printf("Your Name is: %s",name);
   return 0;
}
1
Pranta Palit

Si vous devez lire plusieurs lignes, vous devez vider le tampon. Exemple:

int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
1
levan

En utilisant ce code, vous pouvez prendre l’entrée jusqu’à appuyer sur la touche Entrée de votre clavier.

char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
    scanf("%c ", &ch[i]);
}
1
iFTEKHAR LIVE

La bonne réponse est la suivante:

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    // pay attention to the space in front of the %
    //that do all the trick
    scanf(" %[^\n]s", name);
    printf("Your Name is: %s", name);

    return 0;
}

Cet espace devant% est très important, car si vous avez dans votre programme un autre scanf, disons que vous avez 1 scanf d’une valeur entière et un autre scanf à double valeur ... lorsque vous atteignez le scanf de votre char (chaîne name) cette commande sera ignorée et vous ne pourrez pas saisir de valeur pour elle ... mais si vous mettez cet espace devant%, tout sera correct et rien ne sera ignoré.

0
Cristian Babarusi

"Barack Obama" a un espace entre "Barack" et "Obama". Pour ce faire, utilisez ce code;

#include <stdio.h>
int main()
{
    printf("Enter your name\n");
   char a[80];
   gets(a);
   printf("Your name is %s\n", a);
   return 0;
}
0
Koech

Les méthodes mentionnées ci-dessus fonctionnent, mais chacune a son propre type de problèmes.

Vous pouvez utiliser getline() ou getdelim(), si vous utilisez une plateforme prise en charge par posix. Si vous utilisez Windows et Minigw comme compilateur, il devrait être disponible.

getline() est défini comme:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

Afin de prendre une entrée, vous devez d’abord créer un pointeur sur le type char.

#include <stdio.h>
#include<stdlib.h>

// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of 
// how long the input is, even if the number is small, it isn't going 
// to be a problem
size_t size = 10;

int main(){
// allocate s with the necessary memory needed, +1 is added 
// as its input also contains, /n character at the end.
    s = (char *)malloc(size+1);
    getline(&s,&size,stdin);
    printf("%s",s);
    return 0;
}

Exemple d'entrée: Hello world to the world!

Sortie: Hello world to the world!\n

Une chose à noter ici est que, même si la mémoire allouée pour s est de 11 octets, où getline réalloue la taille d'entrée de 26 octets s à l'aide de realloc().

Donc, peu importe combien de temps votre contribution est.

size est mis à jour avec le nombre d'octets lus, comme dans l'exemple ci-dessus, l'entrée size sera 27.

getline() considère également \n comme une entrée. Ainsi, votre 's' tiendra '\ n' à la fin.

Il existe également une version plus générique de getline(), qui est getdelim(), qui prend un argument supplémentaire, à savoir delimiter.

getdelim() est défini comme:

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

page de manuel Linux

0
nilsocket