scanf only reads first field
I want to read in two strings with scanf
and store them in two variables. How ever only the first one seems to be read properly, the second one just returns (null)
, but I'm not sure why though.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%s%s", c, p);
...
}
Somebody got an idea, what's going wrong? I don't find any errors and for my understanding it should work.
c scanf stdio
add a comment |
I want to read in two strings with scanf
and store them in two variables. How ever only the first one seems to be read properly, the second one just returns (null)
, but I'm not sure why though.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%s%s", c, p);
...
}
Somebody got an idea, what's going wrong? I don't find any errors and for my understanding it should work.
c scanf stdio
When I enterls -l
it only reads thels
properly, that's what i don't understand.scanf
should read the white space between them and store the-l
inp
, but i doesn't.
– anonymoose
Nov 19 '18 at 15:39
3
You've not initialized eitherc
orp
to point to anywhere, so you have undefined behaviour.
– Jonathan Leffler
Nov 19 '18 at 15:42
It’s undefined behavior you didn’t initialize the char * variables.
– danglingpointer
Nov 19 '18 at 15:42
You don't look at the return value ofscanf
. How do you know how many fields were parsed?
– Gerhardh
Nov 19 '18 at 15:50
FYI: There's a Q&A How to preventscanf()
causing buffer overflow in C?
– Jonathan Leffler
Nov 19 '18 at 15:54
add a comment |
I want to read in two strings with scanf
and store them in two variables. How ever only the first one seems to be read properly, the second one just returns (null)
, but I'm not sure why though.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%s%s", c, p);
...
}
Somebody got an idea, what's going wrong? I don't find any errors and for my understanding it should work.
c scanf stdio
I want to read in two strings with scanf
and store them in two variables. How ever only the first one seems to be read properly, the second one just returns (null)
, but I'm not sure why though.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%s%s", c, p);
...
}
Somebody got an idea, what's going wrong? I don't find any errors and for my understanding it should work.
c scanf stdio
c scanf stdio
asked Nov 19 '18 at 15:34
anonymooseanonymoose
335
335
When I enterls -l
it only reads thels
properly, that's what i don't understand.scanf
should read the white space between them and store the-l
inp
, but i doesn't.
– anonymoose
Nov 19 '18 at 15:39
3
You've not initialized eitherc
orp
to point to anywhere, so you have undefined behaviour.
– Jonathan Leffler
Nov 19 '18 at 15:42
It’s undefined behavior you didn’t initialize the char * variables.
– danglingpointer
Nov 19 '18 at 15:42
You don't look at the return value ofscanf
. How do you know how many fields were parsed?
– Gerhardh
Nov 19 '18 at 15:50
FYI: There's a Q&A How to preventscanf()
causing buffer overflow in C?
– Jonathan Leffler
Nov 19 '18 at 15:54
add a comment |
When I enterls -l
it only reads thels
properly, that's what i don't understand.scanf
should read the white space between them and store the-l
inp
, but i doesn't.
– anonymoose
Nov 19 '18 at 15:39
3
You've not initialized eitherc
orp
to point to anywhere, so you have undefined behaviour.
– Jonathan Leffler
Nov 19 '18 at 15:42
It’s undefined behavior you didn’t initialize the char * variables.
– danglingpointer
Nov 19 '18 at 15:42
You don't look at the return value ofscanf
. How do you know how many fields were parsed?
– Gerhardh
Nov 19 '18 at 15:50
FYI: There's a Q&A How to preventscanf()
causing buffer overflow in C?
– Jonathan Leffler
Nov 19 '18 at 15:54
When I enter
ls -l
it only reads the ls
properly, that's what i don't understand. scanf
should read the white space between them and store the -l
in p
, but i doesn't.– anonymoose
Nov 19 '18 at 15:39
When I enter
ls -l
it only reads the ls
properly, that's what i don't understand. scanf
should read the white space between them and store the -l
in p
, but i doesn't.– anonymoose
Nov 19 '18 at 15:39
3
3
You've not initialized either
c
or p
to point to anywhere, so you have undefined behaviour.– Jonathan Leffler
Nov 19 '18 at 15:42
You've not initialized either
c
or p
to point to anywhere, so you have undefined behaviour.– Jonathan Leffler
Nov 19 '18 at 15:42
It’s undefined behavior you didn’t initialize the char * variables.
– danglingpointer
Nov 19 '18 at 15:42
It’s undefined behavior you didn’t initialize the char * variables.
– danglingpointer
Nov 19 '18 at 15:42
You don't look at the return value of
scanf
. How do you know how many fields were parsed?– Gerhardh
Nov 19 '18 at 15:50
You don't look at the return value of
scanf
. How do you know how many fields were parsed?– Gerhardh
Nov 19 '18 at 15:50
FYI: There's a Q&A How to prevent
scanf()
causing buffer overflow in C?– Jonathan Leffler
Nov 19 '18 at 15:54
FYI: There's a Q&A How to prevent
scanf()
causing buffer overflow in C?– Jonathan Leffler
Nov 19 '18 at 15:54
add a comment |
3 Answers
3
active
oldest
votes
char *c, *p;
These are just pointers without any memory behind them. Moreover, they are uninitialized, so reading or assigning they value or reading from or assigning to the memory they point to would be undefined behavior and will spawn nasal demons.
In order to read input from user, you need a place to save the memory to.
char c[20], p[20];
Will allocate 20 characters for c
and 20 character for p
. c
and p
are not pointers, but arrays char[20]
. However arrays handlers "decay" (read: magically change) into pointers in most contexts.
scanf
for "%s"
scanf modifier expects a pointer to char char*
with enough memory to hold the inputted string.
I would do:
int main(int argc, char **argv) {
char c[20], p[20];
printf("Enter a command with a parameter: ");
scanf("%19s%19s", c, p);
}
The 19
in the %19s
limits scanf
so that it does not reads input into memory region that is out of bounds in c
and/or p
pointers, which will lead to undefined behaviour too.
1
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
add a comment |
This is undefined behavior. You have not initialized your pointers. Your compiler should tell you about this.
k.c:8:17: warning: variable 'c' is uninitialized when used here [-Wuninitialized]
scanf("%s%s", c, p);
What you need to do is to initialize your pointers. Using malloc is one way of doing it.
char *c=malloc(SIZE);
char *p=malloc(SIZE);
You want to avoid undefined behavior at ALL COST because it means that the behavior can be ANYTHING, including working the way you want. It can make debugging a nightmare.
But as Swordfish mentioned in the comments, it is suicidal to do this without specifying a max length for your string, because you will have no control over if you write past your buffer, which also is undefined behavior.
add a comment |
you can also use %ms instead of %s because it allocate memory itself and there is no need of allocation memory manually by programmer.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%ms%ms", &c, &p); //no need of allocating memory manually
...
}
1
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should laterfree(c), free(p)
– chux
Nov 19 '18 at 18:47
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53377940%2fscanf-only-reads-first-field%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
char *c, *p;
These are just pointers without any memory behind them. Moreover, they are uninitialized, so reading or assigning they value or reading from or assigning to the memory they point to would be undefined behavior and will spawn nasal demons.
In order to read input from user, you need a place to save the memory to.
char c[20], p[20];
Will allocate 20 characters for c
and 20 character for p
. c
and p
are not pointers, but arrays char[20]
. However arrays handlers "decay" (read: magically change) into pointers in most contexts.
scanf
for "%s"
scanf modifier expects a pointer to char char*
with enough memory to hold the inputted string.
I would do:
int main(int argc, char **argv) {
char c[20], p[20];
printf("Enter a command with a parameter: ");
scanf("%19s%19s", c, p);
}
The 19
in the %19s
limits scanf
so that it does not reads input into memory region that is out of bounds in c
and/or p
pointers, which will lead to undefined behaviour too.
1
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
add a comment |
char *c, *p;
These are just pointers without any memory behind them. Moreover, they are uninitialized, so reading or assigning they value or reading from or assigning to the memory they point to would be undefined behavior and will spawn nasal demons.
In order to read input from user, you need a place to save the memory to.
char c[20], p[20];
Will allocate 20 characters for c
and 20 character for p
. c
and p
are not pointers, but arrays char[20]
. However arrays handlers "decay" (read: magically change) into pointers in most contexts.
scanf
for "%s"
scanf modifier expects a pointer to char char*
with enough memory to hold the inputted string.
I would do:
int main(int argc, char **argv) {
char c[20], p[20];
printf("Enter a command with a parameter: ");
scanf("%19s%19s", c, p);
}
The 19
in the %19s
limits scanf
so that it does not reads input into memory region that is out of bounds in c
and/or p
pointers, which will lead to undefined behaviour too.
1
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
add a comment |
char *c, *p;
These are just pointers without any memory behind them. Moreover, they are uninitialized, so reading or assigning they value or reading from or assigning to the memory they point to would be undefined behavior and will spawn nasal demons.
In order to read input from user, you need a place to save the memory to.
char c[20], p[20];
Will allocate 20 characters for c
and 20 character for p
. c
and p
are not pointers, but arrays char[20]
. However arrays handlers "decay" (read: magically change) into pointers in most contexts.
scanf
for "%s"
scanf modifier expects a pointer to char char*
with enough memory to hold the inputted string.
I would do:
int main(int argc, char **argv) {
char c[20], p[20];
printf("Enter a command with a parameter: ");
scanf("%19s%19s", c, p);
}
The 19
in the %19s
limits scanf
so that it does not reads input into memory region that is out of bounds in c
and/or p
pointers, which will lead to undefined behaviour too.
char *c, *p;
These are just pointers without any memory behind them. Moreover, they are uninitialized, so reading or assigning they value or reading from or assigning to the memory they point to would be undefined behavior and will spawn nasal demons.
In order to read input from user, you need a place to save the memory to.
char c[20], p[20];
Will allocate 20 characters for c
and 20 character for p
. c
and p
are not pointers, but arrays char[20]
. However arrays handlers "decay" (read: magically change) into pointers in most contexts.
scanf
for "%s"
scanf modifier expects a pointer to char char*
with enough memory to hold the inputted string.
I would do:
int main(int argc, char **argv) {
char c[20], p[20];
printf("Enter a command with a parameter: ");
scanf("%19s%19s", c, p);
}
The 19
in the %19s
limits scanf
so that it does not reads input into memory region that is out of bounds in c
and/or p
pointers, which will lead to undefined behaviour too.
edited Nov 19 '18 at 15:49
answered Nov 19 '18 at 15:43
Kamil CukKamil Cuk
9,9611527
9,9611527
1
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
add a comment |
1
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
1
1
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
Thanks a lot, i didn't even knew about the limitation stuff.
– anonymoose
Nov 19 '18 at 15:49
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
@JonathanLeffler Or just remove the comment, since it's no longer needed. :)
– Broman
Nov 19 '18 at 15:51
add a comment |
This is undefined behavior. You have not initialized your pointers. Your compiler should tell you about this.
k.c:8:17: warning: variable 'c' is uninitialized when used here [-Wuninitialized]
scanf("%s%s", c, p);
What you need to do is to initialize your pointers. Using malloc is one way of doing it.
char *c=malloc(SIZE);
char *p=malloc(SIZE);
You want to avoid undefined behavior at ALL COST because it means that the behavior can be ANYTHING, including working the way you want. It can make debugging a nightmare.
But as Swordfish mentioned in the comments, it is suicidal to do this without specifying a max length for your string, because you will have no control over if you write past your buffer, which also is undefined behavior.
add a comment |
This is undefined behavior. You have not initialized your pointers. Your compiler should tell you about this.
k.c:8:17: warning: variable 'c' is uninitialized when used here [-Wuninitialized]
scanf("%s%s", c, p);
What you need to do is to initialize your pointers. Using malloc is one way of doing it.
char *c=malloc(SIZE);
char *p=malloc(SIZE);
You want to avoid undefined behavior at ALL COST because it means that the behavior can be ANYTHING, including working the way you want. It can make debugging a nightmare.
But as Swordfish mentioned in the comments, it is suicidal to do this without specifying a max length for your string, because you will have no control over if you write past your buffer, which also is undefined behavior.
add a comment |
This is undefined behavior. You have not initialized your pointers. Your compiler should tell you about this.
k.c:8:17: warning: variable 'c' is uninitialized when used here [-Wuninitialized]
scanf("%s%s", c, p);
What you need to do is to initialize your pointers. Using malloc is one way of doing it.
char *c=malloc(SIZE);
char *p=malloc(SIZE);
You want to avoid undefined behavior at ALL COST because it means that the behavior can be ANYTHING, including working the way you want. It can make debugging a nightmare.
But as Swordfish mentioned in the comments, it is suicidal to do this without specifying a max length for your string, because you will have no control over if you write past your buffer, which also is undefined behavior.
This is undefined behavior. You have not initialized your pointers. Your compiler should tell you about this.
k.c:8:17: warning: variable 'c' is uninitialized when used here [-Wuninitialized]
scanf("%s%s", c, p);
What you need to do is to initialize your pointers. Using malloc is one way of doing it.
char *c=malloc(SIZE);
char *p=malloc(SIZE);
You want to avoid undefined behavior at ALL COST because it means that the behavior can be ANYTHING, including working the way you want. It can make debugging a nightmare.
But as Swordfish mentioned in the comments, it is suicidal to do this without specifying a max length for your string, because you will have no control over if you write past your buffer, which also is undefined behavior.
edited Nov 19 '18 at 15:46
answered Nov 19 '18 at 15:41
BromanBroman
6,256112241
6,256112241
add a comment |
add a comment |
you can also use %ms instead of %s because it allocate memory itself and there is no need of allocation memory manually by programmer.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%ms%ms", &c, &p); //no need of allocating memory manually
...
}
1
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should laterfree(c), free(p)
– chux
Nov 19 '18 at 18:47
add a comment |
you can also use %ms instead of %s because it allocate memory itself and there is no need of allocation memory manually by programmer.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%ms%ms", &c, &p); //no need of allocating memory manually
...
}
1
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should laterfree(c), free(p)
– chux
Nov 19 '18 at 18:47
add a comment |
you can also use %ms instead of %s because it allocate memory itself and there is no need of allocation memory manually by programmer.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%ms%ms", &c, &p); //no need of allocating memory manually
...
}
you can also use %ms instead of %s because it allocate memory itself and there is no need of allocation memory manually by programmer.
int main(int argc, char **argv) {
char *c, *p;
printf("Enter a command with a parameter: ");
scanf("%ms%ms", &c, &p); //no need of allocating memory manually
...
}
answered Nov 19 '18 at 16:51
Susheel DwivediSusheel Dwivedi
554
554
1
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should laterfree(c), free(p)
– chux
Nov 19 '18 at 18:47
add a comment |
1
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should laterfree(c), free(p)
– chux
Nov 19 '18 at 18:47
1
1
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should later free(c), free(p)
– chux
Nov 19 '18 at 18:47
"%ms"
is a useful idea with libraries that employ this non-standard enhancement. difference between %ms and %s scanf. Note that code still should later free(c), free(p)
– chux
Nov 19 '18 at 18:47
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53377940%2fscanf-only-reads-first-field%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
When I enter
ls -l
it only reads thels
properly, that's what i don't understand.scanf
should read the white space between them and store the-l
inp
, but i doesn't.– anonymoose
Nov 19 '18 at 15:39
3
You've not initialized either
c
orp
to point to anywhere, so you have undefined behaviour.– Jonathan Leffler
Nov 19 '18 at 15:42
It’s undefined behavior you didn’t initialize the char * variables.
– danglingpointer
Nov 19 '18 at 15:42
You don't look at the return value of
scanf
. How do you know how many fields were parsed?– Gerhardh
Nov 19 '18 at 15:50
FYI: There's a Q&A How to prevent
scanf()
causing buffer overflow in C?– Jonathan Leffler
Nov 19 '18 at 15:54