I have a problem with reading empty string in C. I want to read string from the following –
- ass
- ball
- (empty)
- 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.
Chances are, the string contains\r\n\0(or\n\r\0– never remember which comes first).\r\nis newline on Windows and\0is the terminating character of the string.In general, if the first character of the string is
\ror\n, you read an empty string. FWIW this should work on all platforms:Update: you mention that you use
gets, and read from a file. However, for the latter you needfgets, so there is some confusion here. Note thatfgetsincludes the trailing newline character in the string returned, whilegetsdoes 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
fopenthe file, then read from it withfscanfandfgets.Update2: stupid us (and clever @Salil :-). You saySince C arrays are indexed from 0,
string[3]contains the 4th line read! The third line is stored instring[2]– I bet that will contain the empty string you are looking for.