reading a line through scanf

G

gyan

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?
 
S

Suman

gyan said:
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.
 
P

pete

gyan said:
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);
if (!feof(stdin)) {
getchar();
}
if (rc == 0) {
*array = '\0';
}

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

Suman

pete said:
gyan said:
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!
 
P

pete

Suman said:
gyan said:
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.
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 */
 
P

pete

Suman said:
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';
}
 
L

Lawrence Kirby

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?


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
 
C

CBFalconer

gyan said:
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?

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>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,166
Messages
2,570,901
Members
47,442
Latest member
KevinLocki

Latest Threads

Top