tags:

views:

165

answers:

4

I have a problem with reading empty string in c.I want to read string from the following -

1.ass

2.ball

3.(empty)

4.cat

but when i use gets() it does not treat (empty) as string[2].it read 'cat' as string[2].So how can i solve this problem.Which thing should i use?? plz someone help.

char str1[15002][12];
char str2[15002][12];
char s[25];
map<string,int> Map;

int main()
{
    int ncase,i,j,n1,n2,count,Case;

    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);

    scanf("%d",&ncase);

    Case=1;
    while(ncase>0)
    {
        Map.clear();

              //this is the necessery part
        scanf("%d %d\n",&n1,&n2);
        count=0;

        printf("n1=%d n2=%d\n",n1,n2);
        for(i=0;i<n1;i++)
        {
          gets(str1[i]);
        }

        for(i=0;i<n2;i++)
        {
            gets(str2[i]);
        }

            //end of reading input

        for(i=0;i<n1;i++)
        {
            for(j=0;j<n2;j++)
            {
                strcpy(s,str1[i]);
                strcat(s,str2[j]);

                if(Map[s]==0){
                    count+=1;
                    Map[s]=1;
                }

                //printf("%s\n",str1[i]);
            }
        }

        printf("Case %d: %d\n",Case,count);
        Case++;
        ncase--;
    }
    return 0;
}

and input can be look like

i have given the code here.the input may be like

line1>1
line2>3 3
line3>(empty line)
line4>a
line5>b
line6>c
line7>(empty)
line8>b

And i expect

str1[0]=(empty).
str1[1]=a;
str1[2]=b;

and

str2[0]=c;
str2[1]=(empty);
str2[2]=b;




Ok,at last i found the problem.it is the line (printf("n1=%d n2=%d\n",n1,n2);) which creates problem in taking input by gets().Instead of taking newline with the integer n1,n2, then i take newline as a ("%c",&ch) and then everything is okay.

Thanx everyone who ans me.Hope you will also help me later.

+2  A: 
Péter Török
i could not understand.as far as i know gets take everything untill a newline character pressed.so why it does not take (emptyline+newline)as a string??
russell
@russell Post the code!!!
anon
@russell, see my 2nd update, I think that should give you the answer.
Péter Török
peter,actually i wanted to tell that it contain 4th line in in string 3.so that is not problem.
russell
A: 

If there is no string, how do you expect to read it?

Please give us a piece of code :)

==Later edit ==

OK:

"gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with '\0'. "

So basically, if you have:

char x[3];

gets(x);

Then this function will fill in x[0] with '\0'

If you read the manpage you'll see that gets is not recommended. Use fgets instead

Daniel Băluţă
-1: this is not an answer - it should be a comment.
Paul R
for(i=0;i<4;i++) { gets(str1[i]); }there is no way to read an empty string??i want to read the string based on line if there is blank in line three,then gets should read this,so that string number corresponds to line number.
russell
@russell, please post the code in your original answer instead of hiding it in a comment. Including the definition of `str1`!
Péter Török
Paul R: How can I add comments to the original question? Sorry, I've joined stackoverflow yesterday
Daniel Băluţă
@Paul R, your downvote is unfair. He doesn't have the right yet to add comments to other's posts.
Péter Török
@Péter: OK, down-vote removed
Paul R
+1  A: 

Output of this code:

#include <cstdio>

int main ()
{
    int i = 0;

    char string [256];
    while (gets(string)) {
        ++i;
    }
    printf("%d\n", i);

    return 0;
}

For this input

a
b

d

Is

4

Which means, gets() reads all lines correctly, which in turn means your code must be screwed up. Post it here.

chalup
+1  A: 

First and foremost, do not use gets!!!!! It is a buffer overflow vulnerability, since you cannot specify the size of the destination buffer, and so gets() can easily overrun your buffer. Instead, use fgets() or getchar().

Since you are using map<string,int>, it is clear that you are actually using C++ code. In that case, an even better approach is to use the C++ iostreams libraries for your input and output.

Now that I've done with my rant, the problem is this... gets -- which, again, you should never ever use -- according to the spec, will read up until a newline, and "any <newline> shall be discarded". The function fgets() will copy the newline into the destination buffer, giving you the desired behavior.

Michael Aaron Safyan