A program to swap values:
#include <stdio.h>
#include <conio.h>
void swap(int *a, int *b);
void main()
{
int a, b;
printf("Enter two numbers: ");
scanf_s("%d%d", &a, &b);
printf("Before swap\n");
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("After swap\n");
printf("a = %d, b = %d", a, b);
}
void swap(int *a, int *b)
{
printf("Enter the swapped numbers: \n");
scanf("%d%d", a, b);
}
why should I use scanf_s
here instead of scanf
?
Why does this happen?
Thank you for your help.
CodePudding user response:
With scanf
you can scan a string :
char buffer[256];
scanf("%s", buffer);
But it can lead to a buffer overflow if the input string is larger than the destination buffer : like strcpy
it will copy until it finds a '\0'
inside the input. So your compiler is telling you to use scanf_s
instead to specify the size of your buffer so it won't write past it :
char buffer[256];
scanf_s("%s", buffer, 256);
But in your case you are just inputing single ints you can use scanf
anyway. scanf_s
is not a standard function so be careful if your code has to be compile outside visual studio.
More here : Difference between scanf and scanf_s
CodePudding user response:
In the posted code there is no reason to use scanf
nor scanf_s
in the swap
function.
scanf_s
is a function introduced by Microsoft as a supposedly safer(1) alternative to scanf
that is too often used carelessly by unsuspecting programmers, especially for %s
, %[
and %c
conversions, leading to security flaws.
scanf_s
was standardized as an optional extension with subtly different semantics. Programs using scanf_s
are thus not portable.
Microsoft modified their C toolchain to push programmers to use scanf_s
, issuing warnings or errors whenever they encounter scanf
references. This is the cause for the message shown in the screenshot.
In your program, scanf_s
and scanf
would behave essentially the same way as the conversion %d%d
has the same semantics for both functions, yet scanf_s
would detect and handle null pointer arguments for %d
(causing the program to exit) whereas scanf
would just have undefined behavior (causing the program to exit with a segmentation fault).
The swap
function can be written this way:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
Note also that main
should have an int
return type.
(1) This subject is quite sensitive as commented by Andrew Henley: scanf_s
is a function introduced by Microsoft as a vendor-specific, non-portable, not-any-safer alternative to scanf
that results in vendor-lock-in for your code base. An illustration of their internal EEE strategy.