¿Cuándo debo usar el signo comercial con scanf()?

Resuelto Dkova asked hace 11 años • 3 respuestas

¿ Cuáles son las reglas para usar el signo comercial en c mientras se usa scanf()?

struct Student 
{
  char name[20];
  int id;
};

int main(void)
{
  struct Student std1;
  printf("enter name and id of std1\n");
  scanf("%s %d", std1.name, &(std1.id));
}

¿Por qué para String no necesito usar el signo comercial y paraint tengo que usarlo?

¿Existe una regla sobre cuándo utilizar el signo comercial?

Dkova avatar Aug 23 '13 19:08 Dkova
Aceptado

scanf lee tipos particulares de datos en direcciones que se pasan como argumentos segundo, tercero, cuarto, etc.

int var;
scanf("%d",&var);

Aquí varestá el valor y &varla dirección. La declaración anterior dice: leer %del tipo de datos (entero) en &varla dirección.

char s[20];
scanf("%s",s);

Aquí sestá la dirección, no el valor porque ses una matriz de caracteres (cadena). El propio nombre de una matriz indica su dirección. s == &s[0] , ambos son iguales.

La declaración anterior dice: lea %s(conjunto de caracteres) el tipo de datos en la ubicación de la dirección a partir de s.

#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX];
    int i;
    printf("Enter Values of array\n");
    for(i=0;i<MAX;i++)
    {
        printf("Enter a[%d] =  ",i);
        scanf("%d",&a[i]); // reading each time single integer value starting index with 0 and ending index MAX-1.
    }
}

No existe un especificador de formato único para escanear un grupo de números enteros a la vez, como escanear un grupo de caracteres a la vez con la ayuda de %s.

Y aquí a=&a[0];puede escanear un valor entero único directamente a la dirección señalada por a.

scanf("%d",a);
printf("a[0]=%d\n",a[0]);

si ingresa, 10se imprime a[0]=10.

Uso de punteros:

Si usa punteros como se muestra a continuación, sabrá cómo incrementar el puntero y obtener los valores en diferentes ubicaciones de la matriz.

Puede mover la ubicación del puntero para leer matrices. Puede leer matrices sin mover la ubicación del puntero.

  1. Leer matrices moviendo las ubicaciones del puntero

    #include<stdio.h>
    #define MAX 5
    
    int main()
    {
        int a[MAX];
        int i;
        int *ptr;
        ptr = &a[0];
        printf("Enter Values of array\n");
        for(i=0;i<MAX;i++)
        {
            printf("Enter a[%d] =  ",i);
            scanf("%d",ptr);
            ptr++; //moving pointer 
        }
    }
    
  2. Lectura de matrices sin mover ubicaciones de puntero.

    #include<stdio.h>
    #define MAX 5
    
    int main()
    {
        int a[MAX];
        int i;
        int *ptr;
        ptr = &a[0];
        printf("Enter Values of array\n");
        for(i=0;i<MAX;i++)
        {
            printf("Enter a[%d] =  ",i);
            scanf("%d",ptr+i); //we are not moving ptr position we scaning each time into next location by incrementing i 
        }
    }
    

    Cuando se incrementa un puntero, el incremento depende del tipo de puntero. Aquí ptrhay un puntero entero, por lo que ptr+1 incrementará ptr+sizeof(int)las ubicaciones.

int a[5][5];

Esta es una matriz bidimensional, por lo que requiere 5 punteros para escanear, por lo que me declararon matriz de punteros.

#include<stdio.h>
#define MAX 5

int main()
{
    int a[MAX][MAX],i,j;
    int *pointer[MAX];

    for(i=0;i<MAX;i++)
        pointer[i]=&a[i][0]; //initializes the pointers 

    printf("Enter elements :\n");
    for(i=0;i< MAX;i++)
    {   
        for(j=0;j<MAX;j++)
        {
            printf("Enter the a[%d][%d] element: ",i,j);
            scanf("%d",pointer[i]+j); //each time you will move like 00 01 02 03 04 and second time 10 11 12 13 14 and so on...
            //printf("%u or %x",pointer[i]+j,pointer[i]+j);//un comment this line and see the addresses how the address incrementing for each element
        }
    }

    printf("The Given Matrix:\n\n");
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<MAX;j++)
        {
            printf("%d",*(pointer[i]+j));
            printf("\t\t");
        }
        printf("\n\n");
    }
}

Escaneo directo

printf("Enter elements :\n");
for(i=0;i< MAX;i++)
{   
    for(j=0;j<MAX;j++)
    {
        printf("Enter the a[%d][%d] element: ",i,j);
        scanf("%d",&a[i][j]); //we can't do like this a++ or ++a or a+i this is illegal in C. for that purpose we are using pointers  
    }
}

Encontrará la mayor parte del material anterior en The C Programming Language (Segunda edición) de Brian W. Kernighan y Dennis M. Ritchie .

Gangadhar avatar Aug 23 '2013 13:08 Gangadhar

Debido a que las cadenas C tienen un tipo de char []. El nombre de la matriz tiene el valor de su dirección, pero una intvariable no, es necesario usar&

Y está mal escribirlo void main, siempre debes usarlo int main.

Yu Hao avatar Aug 23 '2013 12:08 Yu Hao

En C, las cadenas son matrices de caracteres (terminadas en \0un carácter).

El nombre de la matriz devuelve el puntero del primer elemento de una matriz (ubicación de memoria donde se almacena la matriz), y el nombre de la variable escalar devuelve el valor del escalar, por lo que necesita usar el &operador para obtener la ubicación de memoria del escalar en el que Necesito escribir el valor.

Nemanja Boric avatar Aug 23 '2013 12:08 Nemanja Boric