Reputation: 182
I tried to read 2 variables from the keyboard and to write them on the screen and I have a problem, the program display me only one..
#include <stdio.h>
#include <stdlib.h>
int main()
{
short int n,x;
scanf("%d",&n);
scanf("%d",&x);
printf("%d %d",n,x);
return 0;
}
I introduced 14 and 15 and the program return me 0 and 15 can somebody tell me why?
Upvotes: 3
Views: 488
Reputation: 20141
The formatters in scanf()
and printf()
doesn't match the type of your variables n
and x
.
%d
uses the variables as they were int
while int
has probably the double number of bytes as short int
. (Integer types)
Hence, with the wrong formatters, scanf()
uses the provided addresses wrong.
For printf()
it's a bit more complicated: The short int
s are converted to int
internally. (Default argument promotions) Hence, printing short int
with %d
(as they were int
) doesn't fail.
So, it's the scanf()
what must be fixed.
Either use correct formatters:
#include <stdio.h>
int main()
{
short int n,x;
scanf("%hd",&n);
scanf("%hd",&x);
printf("%d %d",n,x);
return 0;
}
or use correct variable type for the formatters:
#include <stdio.h>
int main()
{
int n,x;
scanf("%d",&n);
scanf("%d",&x);
printf("%d %d",n,x);
return 0;
}
The formatting of scanf()
and printf()
families are very powerful and flexible but unfortunately very error-prone as well. Using them wrong introduces Undefined Behavior. The compiler is (usually) unable to recognize errors as the evaluation of formatters happens at run-time and inside the scanf()
/printf()
functions. So, they have to be used caaarefully.
Upvotes: 1
Reputation: 678
Use %hd format specifier for short int Use %hu format specifier for unsigned int Use %d format specifier for int Use %ld format specifier for long int
#include <stdio.h>
#include <stdlib.h>
int main() {
short int n, x;
scanf("%hd", &n); // Notice %hd instead of %d for short int
scanf("%hd", &x); // Notice %hd instead of %d for short int
printf("%hd%hd", n, x);// Notice %hd instead of %d for short int
return 0;
}
Upvotes: 2
Reputation: 210877
%d
assumes the variable to be of data type int
.
Use the data type int
:
int main()
{
int n,x;
scanf("%d",&n);
scanf("%d",&x);
printf("%d %d",n,x);
return 0;
}
or use %hd
instead of %d
int main()
{
short int n,x;
scanf("%hd",&n);
scanf("%hd",&x);
printf("%hd %hd",n,x);
return 0;
}
Note, scanf("%d",&x);
read a value and stores it to the memory addressed by &x
. Since &x
is treated as a 4 byte memory, 4 bytes are written to the address specified by &x
.
Upvotes: 1