C, leyendo varios números de una sola línea de entrada (scanf?)

4 minutos de lectura

avatar de usuario
migajek

He escrito una aplicación en C que espera dos líneas en la entrada. La primera entrada indica qué tan grande será una matriz de int y la segunda entrada contiene valores separados por espacios. Por ejemplo, la siguiente entrada

5
1 2 3 4 99

debe crear una matriz que contenga {1,2,3,4,99}

¿Cuál es la forma más rápida de hacerlo? Mi problema es leer varios números sin recorrer toda la cadena comprobando si es un espacio o un número.

Gracias.

int i, size;
int *v;
scanf("%d", &size);
v = malloc(size * sizeof(int));
for(i=0; i < size; i++)
    scanf("%d", &v[i]);

Recuerda free(v) después de que haya terminado!

Además, si por alguna razón ya tiene los números en una cadena, puede usar sscanf()

  • ¿Pensé que buscaría números separados por “\n”?

    – migajek

    29 de marzo de 2010 a las 17:24

  • %d (así como la mayoría de las conversiones porcentuales, pero no todas) omite automáticamente cualquier espacio en blanco. Lea la documentación de scanf para más detalles.

    – Denilson Sá Maia

    29 de marzo de 2010 a las 17:27

  • ¿”Si por alguna razón”? Nunca debes usar scanf y debería preferir usar fgets con sscanf. c-faq.com/stdio/scanfprobs.html

    – jamesdlin

    29 de marzo de 2010 a las 19:16

  • @jamesdlin, lo siento, pero no estoy de acuerdo. Si tú realmente saber cómo usar scanf, puede usarlo de manera segura. Y por saber me refiero a comprender realmente todas las opciones y conversiones de scanf. (leer toda la página de manual)

    – Denilson Sá Maia

    30 de marzo de 2010 a las 19:55

  • El hecho de que pueda dejar entradas sin procesar en el búfer de entrada debería hacerte temblar. Sí, hay formas en que puede usar scanf de forma segura, pero todos los obstáculos por los que tienes que pasar simplemente no hacen que valga la pena. fgets con sscanf es mucho más simple y tiene menos trampas para los no iniciados.

    – jamesdlin

    30 de marzo de 2010 a las 21:22

avatar de usuario
MAK Ripon

Aquí ‘N’ es el número de elementos de matriz de Array ‘A’

int N, A[N];
printf("Input no of element in array A: ");
scanf("%d", &N);
printf( "You entered: %d\n", N);
printf("Input array A elements in one line: ");
for(int i=0; i<N; i++){
   fscanf(stdin, "%d", &A[i]);
   printf( "A[%d] is: %d\n", i, A[i]);
}

  • Puede mejorar su respuesta explicando cómo responde esto a la pregunta de OP.

    – Microvirus

    21 de noviembre de 2015 a las 12:02

Aquí hay un ejemplo tomado de http://www.cplusplus.com/reference/cstring/strtok/ que he adaptado a nuestro contexto.

Divide la cadena str en subcadenas y luego convierto cada parte en un int. Espero que la línea de entrada sea números separados por comas, nada más. El tamaño es el tamaño de su matriz. Deberías hacer scanf(“%d”, &size); como dijo Denilson en su respuesta. Al final, tienes tu matriz int con todos los valores.

int main(){
  int size = 5, i = 0;
  char str[] ="10,20,43,1,576";
  int list[size];
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,",");
  list[i] = atoi(pch);
  i++;
  while (pch != NULL)
  {
    pch = strtok (NULL, ",");
    if(pch != NULL)
      list[i] = atoi(pch);
    i++;
  }

  for(i=0;i<size;i++){
    printf("%d. %d\n",i+1,list[i]);
  }
  return 0;
}

avatar de usuario
carl norum

scanf() es una especie de dolor en el cuello. Verificar strtol() para este tipo de problema, te hará la vida muy fácil.

avatar de usuario
wahid_abdul

Este código emplea un enfoque directo de lectura de cada carácter a través de getchar(). Continuamos leyendo un número hasta que encontramos un espacio en blanco. El índice ‘i’ de la matriz se actualiza después de eso. Esto se repite hasta que newline(‘\ n’) se encuentra

#include<iostream>
main()
{
  char ch;
  int arr[30] ;
  ch =getchar();
  int num = 0;
  int i=0;
  while(ch !='\n')
  {
    if(ch == ' ')
    { 
      arr[i] = num;
      i++;
      num = 0;
    }
    if(((ch -48) >=0) && (ch-48 <=9))
      num = (num*10) + (ch - 48);
    ch = getchar();   
  }
  arr[i] = num;
  for(int j=0;i<=i;j++)
     std::cout<<arr[i]<<" ";
 }

  • Si bien este código puede responder la pregunta, proporcionar contexto adicional sobre cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. Lea este stackoverflow.com/help/how-to-answer

    – SR

    17 de junio de 2017 a las 17:43


  • Este enfoque falla cuando los números son negativos o comienzan con un '+'. No es código C.

    – chux – Reincorporar a Monica

    30 de enero de 2018 a las 23:57

  • Si bien este código puede responder la pregunta, proporcionar contexto adicional sobre cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. Lea este stackoverflow.com/help/how-to-answer

    – SR

    17 de junio de 2017 a las 17:43


  • Este enfoque falla cuando los números son negativos o comienzan con un '+'. No es código C.

    – chux – Reincorporar a Monica

    30 de enero de 2018 a las 23:57

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad