Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read empty string in C

Tags:

c

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 reads 'cat' as string[2]. So how can I solve this problem?

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("Case %d: %d\n", Case, count);
        Case++;
        ncase--;
    }
    return 0;
}

and input can 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.

Thanks to everyone who answered me.

like image 494
russell Avatar asked Jun 13 '26 19:06

russell


1 Answers

Chances are, the string contains \r\n\0 (or \n\r\0 - never remember which comes first). \r\n is newline on Windows and \0 is the terminating character of the string.

In general, if the first character of the string is \r or\n, you read an empty string. FWIW this should work on all platforms:

char* string;
// initialize string and read something into it
if (strlen(string) == 0 || string[0] == `\r` || string[0] == `\n`)
  // string is empty

Update: you mention that you use gets, and read from a file. However, for the latter you need fgets, so there is some confusion here. Note that fgets includes the trailing newline character in the string returned, while gets does not.

Update3: The way you read from the file is indeed fishy. You reopen the standard input to read from the file - why??? The standard practice is to fopen the file, then read from it with fscanf and fgets.

Update2: stupid us (and clever @Salil :-). You say

it read 'cat' as string[3]

Since C arrays are indexed from 0, string[3] contains the 4th line read! The third line is stored in string[2] - I bet that will contain the empty string you are looking for.

like image 197
Péter Török Avatar answered Jun 16 '26 10:06

Péter Török