fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
exit(-1);
}
If I type quit, it does not exit the program; I'm wondering why this is the case.
By the way input
is declared as char *input;
.
fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
exit(-1);
}
If I type quit, it does not exit the program; I'm wondering why this is the case.
By the way input
is declared as char *input;
.
Trailing newline in your input. See man fgets. Test for "quit" + newline, for example:
fgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
exit(-1);
}
I completely missed the last sentence, re char *input
. Depending on the architecture, input
will be 4 or 8 bytes long. So the code is effectively
fgets(input, 8, stdin);
which doesn't reflect the real size of memory, input
points to. This might "work" as long as the input is shorter than eight bytes, but will truncate the input, if it is larger. Furthermore, you will get the rest of the input the next time you call fgets
.
You should either give the real size or take @JonathanLeffler's advice and declare a char array instead, e.g.
char input[64];
fgets(input, sizeof(input), stdin);
or
char *input = malloc(N);
fgets(input, N, stdin);
The function fgets
might add a newline at the end of the string read. You'll have to check that:
size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
input[ln] = '\0';
or even
strtok(input, "\n");
fgets()
won't add a newline; it will include the newline that it read that marks the end of line. That way, you can tell whether you read the whole line or not. –
Romaine char
read is the null character, ln
takes on the value of SIZE_MAX
certainly causing an out of bounds read with input[ln]
--> UB. To avoid this exploit, test ln
or maybe use ln[strcspn(ln,"\n")] = 0;
. strtok(input, "\n");
fails to lop off the '\n'
if the first char
is '\n'
. –
Codex Trailing newline in your input. See man fgets. Test for "quit" + newline, for example:
fgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
exit(-1);
}
I completely missed the last sentence, re char *input
. Depending on the architecture, input
will be 4 or 8 bytes long. So the code is effectively
fgets(input, 8, stdin);
which doesn't reflect the real size of memory, input
points to. This might "work" as long as the input is shorter than eight bytes, but will truncate the input, if it is larger. Furthermore, you will get the rest of the input the next time you call fgets
.
You should either give the real size or take @JonathanLeffler's advice and declare a char array instead, e.g.
char input[64];
fgets(input, sizeof(input), stdin);
or
char *input = malloc(N);
fgets(input, N, stdin);
Suggest you code this as:
if(strstr(input, "quit") != NULL){
Reason: This will solve issue of people adding extra characters (e.g. space before or after text).
This solution only needs the standard library (stdio.h) and gives the same results.
for (i = 0; input[i] != '\0'; i++); /* getting the string size */
input[i-1] = '\0'; /* removing the newline */
what i did is to replace newline by '\0' null .
while(fgets(message,80,stdin))
{
l=strlen(message)-1;
if(message[l]='\n') message[l]='\0';
else message[i+1]='\0';
}
strlen(message) > 80
or use EOF as terminator. –
Watchcase if(message[l]='\n') message[l]='\0'
whaaat? –
Mum © 2022 - 2024 — McMap. All rights reserved.
char *input;
without allocating space for it to point to, you are lucky (or do I mean unlucky?) that you didn't get a crash. You must make sure there's enough space:char input[64];
would be better; I usually use 4096 for the line length unless there's a compelling reason to use something shorter. Also, you should check thatfgets()
read some data:if (fgets(input, sizeof(input), stdin) != 0) ...OK - read some data...
. – Romaine