How can I read and store strings in C from stdin until a blank line is entered?

  • Thread starter Thread starter dwx1
  • Start date Start date
  • Tags Tags
    Reading Strings
AI Thread Summary
The discussion focuses on reading strings from standard input until a blank line is entered, highlighting several issues with the initial code attempt. Key points include the incorrect use of string comparison in C, where `buffer != ""` does not function as intended; instead, the `strcmp` function should be used. Another major issue is that the code assigns the address of `buffer` to the `strings` array, which leads to all entries pointing to the same memory location. To properly store the strings, memory must be allocated for each entry, either through `malloc()` or by declaring the array as `char strings[LINE_CAP][MAX_LENGTH]`. The use of `scanf` is also criticized for not handling blank lines correctly, with a recommendation to use `fgets` for reading input. The thread concludes with a user successfully resolving their issues after receiving guidance on these points.
dwx1
Messages
6
Reaction score
0
I have to read a list of strings in from stdin and store them, stopping when a blank line is entered. Here's what I tried...
Code:
        const int LINE_CAP = 100;
        const int MAX_LENGTH = 80;

        char *strings[LINE_CAP];
        int strings_index = 0;
        char buffer[MAX_LENGTH];

        printf("%s", "Enter words:\n");
        scanf("%s", buffer);
        while(buffer != "")
        {
                        strings[strings_index] = buffer;
                        strings_index++;
                        scanf("%s", buffer);
        }

No luck. Does anyone know how to do it?
Thanks.
 
Technology news on Phys.org
is that the proper way to declare an array of strings? if it is then "" may not be the correct termination for a blank.
 
There's quite a few problems with this code.

First of all, you can't do things like buffer != "" in C. To compare strings you'll need to use the strcmp function. Doing buffer != "" just compares two pointers, which is not at all what you want.

Second, when you do strings[string_index] = buffer, it does not copy the contents of buffer into strings[string_index]. It merely sets strings[string_index] to point to the same location in memory as buffer. That's certainly not what you want to do. Buffer gets overwritten every pass through the loop.

Third, there's no guarantee that the lines you read in will fit into buffer. You need to use a formatting option like %79s in scanf to ensure that it doesn't try to read data in past the end of the buffer (and you'll have to make sure that the last character in the string is a NUL, or else functions like strcpy and strcmp and printf will not work). You may want to consider using fgets instead. In fact, since you want to read in lines, you may want to use fgets anyway; scanf will stop when it hits whitespace, not when it hits the end of a line.
 
Ok, I thought I got what you were saying, but I seem to be confused...

So I tried using while(strcmp(buffer, "")), but that doesn't stop it when I
enter a blank line.

And I tried doing *strings[strings_index] = buffer, that didn't work either.

I'm kind of lost again.
 
Last edited:
dwx1 said:
Ok, I thought I got what you were saying, but I seem to be confused...
So I tried using while(strcmp(buffer, "")), but that doesn't stop it when I
enter a blank line.
And I tried doing *strings[strings_index] = buffer, that didn't work either.
I'm kind of lost again.

scanf discards whitespace. If you enter a blank line it skips over it and keeps waiting for you to enter data.

To copy buffer into strings[strings_index] you can use strcpy, as in strcpy(strings[string_index], buffer). But that won't work unless you allocate memory for the string first. strings[string_index] is just a pointer, and since you don't initialize it, it could be pointing anywhere. Either use malloc() to allocate memory for it first, or declare strings using "char strings[LINE_CAP][MAX_LENGTH];" instead.
 
Ok, I got it working! Thanks so much!
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.
Thread 'Project Documentation'
Trying to package up a small bank account manager project that I have been tempering on for a while. One that is certainly worth something to me. Although I have created methods to whip up quick documents with all fields and properties. I would like something better to reference in order to express the mechanical functions. It is unclear to me about any standardized format for code documentation that exists. I have tried object orientated diagrams with shapes to try and express the...
Back
Top