C - Comparing string literal with character array
Asked Answered
L

4

8

I am new to C and am still a bit confused about how to use strings via character arrays.

In my C program, I am accepting commands from the user:

char command[20];
scanf("%s",command);

Of course, afterwards I want to figure out what command they typed (something similar to: "if (command == "hello"), then do something"). I know this is not possible in C because I am comparing a string literal to a character array, but what would be a good way to it? I have tried using strcmp(command, "hello") and still got errors.

Any advice you can provide would be very appreciated. Thank you!

Laterite answered 2/8, 2013 at 21:31 Comment(8)
What "errors", precisely? strcmp() is the way to go.Postpaid
Also, the single worst error I see in your code is the use of scanf(). Forget that function altogether. You are looking for fgets(command, sizeof command, stdin) instead.Postpaid
(The main reason behind not using scanf; there's no limit to how much it could scan. What if the user inputs 21 characters?)Gingergingerbread
Furthermore, a string literal is a character array itself, by the way.Postpaid
@DennisMeng And it doesn't scan whitespace using %s by default, it pretends to understand regexes but it doesn't, etc, etc...Postpaid
That too. But letting the user overflow your buffer is scarier than screwing up regexes.Gingergingerbread
@H2CO3: It doesn't pretend to understand regexes, it just implements a scanning syntax that's less powerful than regexes. Buffer overflow can be avoided by using, for example, scanf("%20s", command);. But fgets() followed by sscanf() is more robust.Palatalized
@KeithThompson What I was referring to is merely that the syntax of scanf() format strings can very easily be misleading to someone who just started out with programming.Postpaid
R
7

strcmp returns 0 when the strings are the same. I have code that uses strcmp comparing character arrays to string literals, and I was quite confused when it wasn't working. Turns out it was wrong for me to assume it would return 1 when the string are the same!

Maybe you've made the same mistake?

Rutger answered 2/8, 2013 at 21:34 Comment(1)
Indeed, making assumptions is the incorrect way of writing programs - one should read the documentation instead.Postpaid
R
15

I have written a complete version of what I think you are trying to do:

    #include <string.h>
    void main()
    {

       char command[20];
       scanf("%s",command);

       // command and "hello" can be less than, equal or greater than!
       // thus, strcmp return 3 possible values
       if (strcmp(command, "hello") == 0)
       {
          printf("\nThe user said hello!");
       }

    }

Several people have commented about using scanf and they are correct, except that a new programmer has to start somewhere in learning this stuff, so don't feel too bad we are all learning...

Hope this helps.

Rolph answered 3/8, 2013 at 5:4 Comment(5)
Yes, you were all right. The problem was that I thought strcmp was simply a boolean function, when in reality it returns 3 possible values. And I will try to use fgets once I become more familiar with it. The reason why I am using scanf is that I need to read the command typed by the user up until the first white space (not the whole line, since I need to read two commands per line). Once I figure out how to control what I am reading with fgets, I will definitely use it. Thanks for the advice with fgets, and thanks so much everybody for the thorough answers! You are so helpful!Laterite
You mind upvoting useful answers and selecting one as the right answer?Rutger
RSinghS - I have tried but I need to have 15 reputation to upvote answers. I will definitely upvote the useful answers once I am able to! :)Laterite
@Irina, I think if it is your question you can select the "correct" answer, from your point of view!! This is different than upvoting but it does provide useful feedback.Rolph
Understood and done. Thanks and sorry! Still new around here. :)Laterite
R
7

strcmp returns 0 when the strings are the same. I have code that uses strcmp comparing character arrays to string literals, and I was quite confused when it wasn't working. Turns out it was wrong for me to assume it would return 1 when the string are the same!

Maybe you've made the same mistake?

Rutger answered 2/8, 2013 at 21:34 Comment(1)
Indeed, making assumptions is the incorrect way of writing programs - one should read the documentation instead.Postpaid
K
2

I think this is a perfect starting point for you:

http://www.wikihow.com/Compare-Two-Strings-in-C-Programming

It's probably written at the right level for you. Good luck and welcome to stackoverflow!

Kill answered 2/8, 2013 at 21:34 Comment(0)
H
0

When talking about string in C, it normally takes two forms: 1. a character array, 2. a character pointer. Most of the time, they are interchangeable. For example:

char *cmd_ptr = "command1";
char cmd_array[20] = "command2";
printf ("cmd1: %s cmd2: %s\n", cmd_ptr, cmd_array);

The main difference for the above definition is that for cmd_ptr you could not change its content like cmd_ptr[0] = 'a'; for cmd_array you could change any element in the array.

But you could do cmd_ptr = cmd_array; then you could make changes through cmd_ptr as it points to the same location as cmd_array.

Husky answered 3/8, 2013 at 0:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.