xtreak
xtreak

Reputation: 1376

Change input separator in c

Hi i was reading K & R C where in the example to use getchar we have to press RET to end the input. Is there any way to change the input so that I can change the newline as the input separator to a comma. I use a Linux Mint . 64 bit. I get the input by running the program as ./Hello.o

Eg.

Hello world<RET>

but as I type a comma or dot the input should end

Eg.

Hello world, //End of input due to comma 

Is there any way to change new line to another character to comma

Upvotes: 0

Views: 381

Answers (3)

Tom Fenech
Tom Fenech

Reputation: 74685

It depends what function you want to use. For example, if you want to use getdelim you can provide a delimiter argument

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

for example:

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

int main()
{
    char * lineptr = malloc(1000 * sizeof(char));
    size_t n = 1000;
    /*type something in that ends in a comma*/
    getdelim(&lineptr, &n, ',', stdin);
    /*print the result*/
    printf("%s\n", lineptr);
    free(lineptr);
    return 0;
}

Note that this still requires you to press enter but everything after the comma will be discarded.

edit

Maybe you could try something like this?

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

/* Use this variable to remember original terminal attributes. */

struct termios saved_attributes;

void
reset_input_mode (void)
{
    tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
}

void set_input_mode (void)
{
    struct termios tattr;
    char *name;

    /* Make sure stdin is a terminal. */
    if (!isatty (STDIN_FILENO))
    {
        fprintf (stderr, "Not a terminal.\n");
        exit (EXIT_FAILURE);
    }

    /* Save the terminal attributes so we can restore them later. */
    tcgetattr (STDIN_FILENO, &saved_attributes);
    atexit (reset_input_mode);

    /* Set the funny terminal modes. */
    tcgetattr (STDIN_FILENO, &tattr);
    tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
    tattr.c_cc[VMIN] = 1;
    tattr.c_cc[VTIME] = 0;
    tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
}

int main()
{
    char c;

    set_input_mode ();

    while (1)
    {
        read (STDIN_FILENO, &c, 1);
        if (c == ',')
            break;
        else
            putchar (c);
    }

    return 0;
}

This program will receive input until a comma. I can't take any credit for it, I found this link on noncanonical input.

Upvotes: 2

I would first read the standard input line by line using getline(3). Then you can do your own tokenizing on that line, e.g. with sscanf(3), strtok(3) or other means (e.g. using strchr(3) appropriately). See this answer for some code (but getline won't enable you to avoid pressing the return key, because the kernel tty subsystem is processing that key, unless you do raw keyboard input which is really difficult).

On Linux, you might be interested in using readline(3) from the readline library (which is quite powerful, so learn more about it). Maybe you could use the ncurses library.

Be aware that terminals are very complex things (or abstractions), mostly for historical reasons. Read with care the tty demystified page, and the Keyboard and Console HowTo.

Avoiding pressing the enter or return key is surprisingly difficult on Unix systems (and probably on others too!) because the kernel (and not only the application or its libc i.e. <stdio.h> functions) is usually buffering the input line. To avoid that, you need to do very low level and difficult programming (which could take you several weeks of work). Read first Advanced Linux Programming.

So instead of doing all the difficult coding by yourself, take several days to learn how to use readline (or maybe ncurses). Even with the help of such libraries, it is not that easy!

Upvotes: 1

0xF1
0xF1

Reputation: 6116

You can use getch() function available in ncurses library.

You do no need to press Enter after each character input, therefore you can scan input in a while loop using getch() unless you get a , or any special character you want.

Upvotes: 1

Related Questions