Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

reading a line through scanf

20 views
Skip to first unread message

gyan

unread,
Jun 30, 2005, 1:30:36 AM6/30/05
to
I want to read a line with white spaces though scanf.
So i used:
scanf("%['/n']",string);

above is working in one program, but in other..what may be the reason?

Suman

unread,
Jun 30, 2005, 2:23:28 AM6/30/05
to

gyan wrote:
> I want to read a line with white spaces though scanf.
> So i used:
> scanf("%['/n']",string);

^
Should you not use '\n' instead?And should you not exclude the newline
when trying to read a newline? I feel [^\n] might just be more
appropriate.

pete

unread,
Jun 30, 2005, 2:31:10 AM6/30/05
to

#define LENGTH 20
#define str(x) # x
#define xstr(x) str(x)

int rc;
char array[LENGTH + 1];

rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
if (!feof(stdin)) {
getchar();
}
if (rc == 0) {
*array = '\0';
}

/* rc will be either 1, 0, or EOF */

--
pete

Suman

unread,
Jun 30, 2005, 2:40:32 AM6/30/05
to

pete wrote:
> gyan wrote:
> >
> > I want to read a line with white spaces though scanf.
> > So i used:
> > scanf("%['/n']",string);
> >
> > above is working in one program, but in other..what may be the reason?
>
> #define LENGTH 20
> #define str(x) # x
> #define xstr(x) str(x)
>
> int rc;
> char array[LENGTH + 1];
>
> rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);

^
Just a query, should we not write "[^\n]%*1[^\n]", instead? On my gcc
(4.0.0)
it keeps waiting if I don't specify the length.


> if (!feof(stdin)) {
> getchar();
> }
> if (rc == 0) {
> *array = '\0';
> }
>
> /* rc will be either 1, 0, or EOF */

Neat, really very neat!

pete

unread,
Jun 30, 2005, 2:58:42 AM6/30/05
to
Suman wrote:
>
> pete wrote:
> > gyan wrote:
> > >
> > > I want to read a line with white spaces though scanf.
> > > So i used:
> > > scanf("%['/n']",string);
> > >
> > > above is working in one program,
> > > but in other..what may be the reason?
> >
> > #define LENGTH 20
> > #define str(x) # x
> > #define xstr(x) str(x)
> >
> > int rc;
> > char array[LENGTH + 1];
> >
> > rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
> ^
> Just a query, should we not write "[^\n]%*1[^\n]", instead?

No.
That's supposed to eat *all*
of the line characters which exceded LENGTH, if there are any,
up to but not including the newline.

> On my gcc (4.0.0)
> it keeps waiting if I don't specify the length.
> > if (!feof(stdin)) {
> > getchar();
> > }
> > if (rc == 0) {
> > *array = '\0';
> > }
> >
> > /* rc will be either 1, 0, or EOF */
> Neat, really very neat!

/* BEGIN new.c */

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 30


#define str(x) # x
#define xstr(x) str(x)

int main(void)
{
int rc;
char string[LENGTH + 1];

fputs("Enter a string with spaces:", stdout);
fflush(stdout);
rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", string);
if (!feof(stdin)) {
getchar();
}
while (rc == 1) {
printf("Your string is:%s\n\n"
"Hit the Enter key to end,\nor enter "
"another string to continue:", string);
fflush(stdout);
rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", string);
if (!feof(stdin)) {
getchar();
}
}
return 0;
}

/* END new.c */


--
pete

pete

unread,
Jun 30, 2005, 3:10:31 AM6/30/05
to
Suman wrote:

> Neat, really very neat!

I especially like it for use with text files.
The only possible drawback, is that you get no feedback
on whether or not the lines are longer than LENGTH.

int nonblank_line(FILE *fd, char *line)
{
int rc;

do {
rc = fscanf(fd, "%" xstr(LENGTH) "[^\n]%*[^\n]", line);
if (!feof(fd)) {
getc(fd);
}
} while (rc == 0 || rc == 1 && blank(line));
return rc;
}

int blank(char *line)
{
while (isspace(*line)) {
++line;
}
return *line == '\0';
}

--
pete

Lawrence Kirby

unread,
Jun 30, 2005, 5:39:20 AM6/30/05
to


This scand for a matching sequence of ' / and n characters so I would be
very surprised if this "works" for what you want opn any system.

The appropriate function for reading a line is fgets(). While scanf() can
be made to do this it is not what it is designed for and is awkward. Once
you've read a line you can use all of C's string handing functions
including sscanf() to decode it.

Lawrence

CBFalconer

unread,
Jun 30, 2005, 1:41:14 PM6/30/05
to

Why bother - scanf is not easy to handle. If you want a complete
line, get a complete line. fgets is one was. gets is not (never
use it). Another possibility is my ggets, which is also written in
portable standard c, has the simplicity of gets together with the
complete safety (although you do have to remember to free the line
storage when you are done with it). See:

<http://cbfalconer.home.att.net/download/ggets.zip>

--
Chuck F (cbfal...@yahoo.com) (cbfal...@worldnet.att.net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net> USE worldnet address!


0 new messages