I've been trying to look for answer myself, but I can't find one. I want to insert a part of the programming that reads in a string like "Hello" and stores and can display it when I want, so that printf("%s", blah);
produces Hello
.
Here's the code part that's giving me trouble
char name[64];
scanf_s("%s", name);
printf("Your name is %s", name);
I know that printf
isn't the problem; the program crashes after something is input after a prompt. Please help?
From the specification of fscanf_s()
in Annex K.3.5.3.2 of the ISO/IEC 9899:2011 standard:
The
fscanf_s
function is equivalent tofscanf
except that thec
,s
, and[
conversion specifiers apply to a pair of arguments (unless assignment suppression is indicated by a*
). The first of these arguments is the same as forfscanf
. That argument is immediately followed in the argument list by the second argument, which has typersize_t
and gives the number of elements in the array pointed to by the first argument of the pair. If the first argument points to a scalar object, it is considered to be an array of one element.
and:
The
scanf_s
function is equivalent tofscanf_s
with the argumentstdin
interposed before the arguments toscanf_s
.
MSDN says similar things ( scanf_s()
and fscanf_s()
).
Your code doesn't provide the length argument, so some other number is used. It isn't determinate what value it finds, so you get eccentric behaviour from the code. You need something more like this, where the newline helps ensure that the output is actually seen.
char name[64];
if (scanf_s("%s", name, sizeof(name)) == 1)
printf("Your name is %s\n", name);
I used this very often in my university classes so this should work fine in Visual Studio (tested in VS2013):
char name[64]; // the null-terminated string to be read
scanf_s("%63s", name, 64);
// 63 = the max number of symbols EXCLUDING '\0'
// 64 = the size of the string; you can also use _countof(name) instead of that number
// calling scanf_s() that way will read up to 63 symbols (even if you write more) from the console and it will automatically set name[63] = '\0'
// if the number of the actually read symbols is < 63 then '\0' will be stored in the next free position in the string
// Please note that unlike gets(), scanf() stops reading when it reaches ' ' (interval, spacebar key) not just newline terminator (the enter key)
// Also consider calling "fflush(stdin);" before the (eventual) next scanf()
The scanf_s
function is equivalent to scanf
except that %c
, %s
, and %[
conversion specifiers each expect two arguments (the usual pointer and a value of type rsize_t
indicating the size of the receiving array, which may be 1 when reading with a %c
into a single char)
Your code doesn't provide the size of receiving array, also the variable name
is a pointer pointing to the first character of the array, so it contains the address of name[0]
. Therefore your first argument name
in scanf_s
is correct because name is a pointer, also note that, for the second argument you can't insert the size of a pointer like sizeof(name)
because it is always same. You need to specify the size of your char array ( name[64]
), so for the second argument you should insert sizeof(name[64])
or 64*sizeof(char)
.
You can correct your code as follows:
char name[64];
if (scanf_s("%s", name, sizeof(name[64])) == 1)
printf("Your name is %s\n", name);
Here is a part of code that works for me fine:
char name[64];
scanf_s("%63s", name,(unsigned)_countof(name));
printf("Your name is %s", name);
For more information here is a link: https://learn.microsoft.com/de-de/cpp/c-runtime-library/reference/scanf-s-scanf-sl-wscanf-s-wscanf-sl?view=msvc-170
Best Regards
you should do this : scanf ("%63s", name);
Update :
The below code worked for me:
#include <stdio.h>
int main(void) {
char name[64];
scanf ("%63s", name);
printf("Your name is %s", name);
return 0;
}
if you are using visual studio, go to Project properties -> Configuration Properties -> C/C++-> Preprocessor -> Preprocessor Definitions
click on edit
and add _CRT_SECURE_NO_WARNINGS
click ok, apply the settings and run again.
Note: this is only good if you are doing your homework or something like that and it's not recommended for production.
#include<stdio.h>
int main()
{
char name[64];
printf("Enter your name: ");
scanf("%s", name);
printf("Your name is %s\n", name);
return 0;
}
#include<stdio.h>
int main()
{
char name[64];
printf("Enter your name: ");
gets(name);
printf("Your name is %s\n", name);
return 0;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.