Cadena Scanf con espacios en C

Waqar Aslam 12 octubre 2023
  1. Use RegEx en scanf para obtener la entrada del usuario con espacios en C
  2. Use %[^\n]s en scanf para obtener la entrada del usuario con espacios en C
  3. Use %[^\n]%*c en scanf para obtener la entrada del usuario con espacios en C
  4. Use gets() en scanf para obtener la entrada del usuario con espacios en C
Cadena Scanf con espacios en C

Este artículo discutirá el descriptor de archivo en el lenguaje de programación C.

Al recopilar información del usuario, scanf() ignorará, en la mayoría de los casos, elementos como espacios, barras diagonales inversas, tabulaciones, etc.; sin embargo, podemos evitar esta limitación mediante el uso de especificadores scanset. Los especificadores de scanset se denotan con la notación %[].

Al expresarlo entre corchetes, podemos escribir un carácter o una cadena, según lo que queramos lograr.

El lenguaje de programación C proporciona varias formas diferentes que podemos usar para obtener información del usuario mientras mantenemos los espacios incluidos en él. Veamos algunos ejemplos para implementarlo.

Use RegEx en scanf para obtener la entrada del usuario con espacios en C

Este %[] es un especificador de scanset, y usar 0-9, a-z, un espacio y A-Z significa que solo esos caracteres pueden usarse como entrada. No se puede usar nada más.

La s indica que la computadora acepta una cadena como entrada.

Código fuente:

#include <stdio.h>

int main(int argc, char const *argv[]) {
  char name[20];

  printf("Please enter your full name: ");
  scanf("%[0-9a-zA-Z ]s", name);
  printf("\nYour name is: %s", name);

  return 0;
}

Producción :

Please enter your full name: Saad Aslam

Your name is: Saad Aslam

Use %[^\n]s en scanf para obtener la entrada del usuario con espacios en C

El carácter scanset para esta instancia es []. El carácter ^\n le indica al sistema operativo que continúe leyendo la entrada del usuario hasta que encuentre una nueva línea.

En este caso, aprovechamos el operador XOR, que devuelve verdadero a menos que dos letras sean idénticas. Después de que se haya determinado que el carácter es una nueva línea \n, el operador XOR ^ devolverá falso cuando se lea la cadena.

Por lo tanto, lo escribimos como %[n]s en lugar de %s. Por lo tanto, para obtener una línea de entrada que contenga espacios, podemos usar lo siguiente:

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

Código fuente:

#include <stdio.h>

int main() {
  char str[100];

  printf("Please enter your full name: ");
  scanf("%[^\n]s", str);
  printf("\nYour name is: %s", str);

  return 0;
}

Producción :

Please enter your full name: Saad Aslam

Your name is: Saad Aslam

Use %[^\n]%*c en scanf para obtener la entrada del usuario con espacios en C

En este caso, el carácter del scanset es []. El carácter ^\n indica al sistema operativo que continúe tomando datos hasta que se encuentre una nueva línea.

Luego, utilizando %*c, lee el carácter de nueva línea, y el * utilizado aquí indica que este carácter de nueva línea se excluye de la salida.

Código fuente:

#include <stdio.h>

int main() {
  char str[20];

  printf("Please enter something: ");
  scanf("%[^\n]%*c", str);
  printf("\nYou entered: %s", str);

  return 0;
}

Producción :

Please enter something: Writer at Delft Stack

You entered: Writer at Delft Stack

Use gets() en scanf para obtener la entrada del usuario con espacios en C

La función char *gets(char *str) incluida en la biblioteca C leerá una línea de la entrada estándar (stdin) y la guardará en la cadena a la que se refiere str. Se detiene cuando se lee el carácter de nueva línea o cuando se llega al final del archivo, lo que ocurra primero, según las circunstancias.

Código fuente:

#include <stdio.h>

int main() {
  char str[50];

  printf("Please enter your name: ");
  gets(str);

  printf("\nYour name is: %s", str);

  return (0);
}

Producción :

Please enter your name: Saad Aslam

Your name is: Saad Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

Artículo relacionado - C String