One of my assignments in to write my own UNIX Shell. To receive input from the user, I am using fgets to capture the input as a string but I'm not really sure how it works. When I run:
char command[50];
fgets(command, sizeof(command), stdin);
printf("Your Command: %s", &command);
int length = strlen(command);
printf("Length of String: %d\n", length);
Lets say my the input was "exit". strlen says that the string is 5 characters long, instead of four. I want to do this:
if( (strcmp(command, "exit")) == 0 ){
doSomething();
}
but command is never equaling the string that I want it to; its like it has an unknown character that Im not sure of. Is it the null character at the end? How do I change the if statement to check that the user input caught with fgets equals "exit"? Thanks!
As noted,
fgets
(3) gives you the trailing '\n'. If you usegets
(3), you don't gets the trailing newline. Nothing like consistency, sez I.Perl has a hand chomp() function that trims the trailing newline if its present — you could do worse than to roll your own:
Probably the easiest way to handle this is to switch to using
scanf
to read the input:fgets
will always include the line termination character in the input string. You can remove any space, including the newline characters, from the end of your "command" by doing:fgets
considers the line terminator as a valid character. That's the extra character you are receiving.Just do something like
command[strlen(command) - 1] = '\0';
to remove the line terminator. Then you are free to do all yourstrcmp
's.Your string still has the newline at the end. You could compare with
"exit\n"
or use something likestrncmp(command, "exit", 4)
. Note that that would accept anything that started with "exit" and ignore the rest.From the
fgets
manual page:Bottom-line: you have an extra newline at the end of your string when comparing.