¿Cuándo debo usar el signo comercial con scanf()?
¿ 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?
scanf lee tipos particulares de datos en direcciones que se pasan como argumentos segundo, tercero, cuarto, etc.
int var;
scanf("%d",&var);
Aquí var
está el valor y &var
la dirección. La declaración anterior dice: leer %d
el tipo de datos (entero) en &var
la dirección.
char s[20];
scanf("%s",s);
Aquí s
está la dirección, no el valor porque s
es 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, 10
se 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.
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 } }
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í
ptr
hay un puntero entero, por lo queptr+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 .
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 int
variable no, es necesario usar&
Y está mal escribirlo void main
, siempre debes usarlo int main
.
En C, las cadenas son matrices de caracteres (terminadas en \0
un 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.