C: how to get user input without ENTER (\n) being recorded? -


i trying read user input string record user input keys without '\n'.

so, delimiting command , argument user inputs e.g. "mkdir hello" ("mkdir" = command, "hello" = argument) returns argument ("hello\n").

is there way remove '\n' effectively?

also, how null terminate strings?

int main(void) {      char directoryname[129] = "";      printf("\nprogram start... \n\n");      // getting user input string     // , splitting command , argument     char inputstring[129];     char delimiter[] = " ";     char *line;     char *arg;     struct tree_node *root = make_tree_node("root\0");     //struct tree_node *cwd = make_tree_node("root\0");     struct tree_node *cwd = root;      printf("/%s >", directoryname);      while (fgets(inputstring, 128, stdin)) {          // char * before strsep, set pointer original checkstring         // original checkstring         // free memory           // gets argument , stores arg         line = malloc(sizeof(char) * strlen(inputstring));         strcpy(line, inputstring);         arg = strsep(&line, delimiter);         arg = strsep(&line, delimiter);         printf("your argument: %s\n", arg);          printf("/%s >", directoryname); } 

entire code:

#include <stdio.h> /* fgets(), fprintf() , printf() */ #include <stdlib.h> /* exit_failure */ #include <ctype.h> /* isspace() */ #include <string.h> #include <stddef.h>  // commands char exitprogram[] = "exit"; char listdirectory[] = "ls"; char commanddirectory[] = "cd"; char makedirectory[] = "mkdir"; char removedirectory[] = "rmdir";  // holds string buffer of length 128 // pointer parent // pointer first node of list of children typedef struct tree_node {     char string_buffer[128];     struct tree_node *parent;     struct list_node *first_child; // first node of list of children? } tree_node;  // pointer tree node // pointer next item in list typedef struct list_node {     struct tree_node *tree;     struct list_node *next; } list_node;  // allocates right amount of space tree node // sets pointers null // initialises string buffer given name // returns pointer tree node struct tree_node *make_tree_node(char *name) {     tree_node *tree = malloc(sizeof(*tree));     tree -> parent = null;     tree -> first_child = null;     strcpy(tree -> string_buffer, name);     return tree; }  // allocates new list node // assigns fields tree node references , next list node // returns pointer new list node struct list_node *make_list_node(struct tree_node *v, struct list_node *next) {     list_node *instance = malloc(sizeof(*instance));     instance -> tree = v;     instance -> next = next;     return instance; }   // checks whether directory named arg exists in current working directory  // creates directory if not exist  // if arg null, function should print error message void do_mkdir(struct tree_node *cwd, char *arg) {      printf("making directory name %s \n", arg);      // check if directory exists     struct list_node *subdir = cwd->first_child;      while (subdir != null) {         if (strcmp(subdir->tree->string_buffer, arg) == 0) {             printf("directory name exists. please provide name.\n");             return;         }         subdir = subdir->next;     }      // adding new directory     struct tree_node *newsubdir = make_tree_node(arg);     newsubdir->parent = cwd;     struct list_node *newlistnode = make_list_node(newsubdir, null);      // putting new node in alphabetical order     struct list_node *prev = null;     if (subdir == null) {         newlistnode->next = cwd->first_child;         cwd->first_child = newlistnode;     } else {         while (subdir != null) {             // todo: use case insensitive compare             if (strcmp(arg, subdir->tree->string_buffer) > 0) {                 // inserting in front                 newlistnode->next = subdir->next;                 prev->next = newlistnode;                 break;             }             prev = subdir;             subdir = subdir->next;         }         if (subdir == null) {             subdir->next = newlistnode;         }     }     printf("directory added: %s", arg); }  // prints children of directory cwd (not recursively) void do_ls(struct tree_node *cwd) {     printf("listing directories...\n");     struct list_node *subdir = cwd -> first_child;     while (subdir != null) {         printf("%s", subdir ->tree -> string_buffer);         subdir = subdir->next;     } }  // *checks whether cwd has subdirectory named arg // *if yes, function returns corresponding tree node (and become new working directory) // *if no, prints error message // *handle cd , cd .. struct tree_node *do_cd(struct tree_node *cwd, struct tree_node *root, char *arg) {      // checks if cwd has subdirectory named arg     struct list_node *subdir = cwd -> first_child;      while (subdir != null) {         if (strcmp(subdir->tree->string_buffer, arg) == 0) {             printf("subdirectory exists: entering!\n");             subdir->tree = cwd;             printf("making subdirectory current working directory: name = %s\n", arg);             printf("returning current working directory: %s.\n", arg);             return cwd;         }         subdir = subdir->next;     }     printf("directory not exist!\n");     return null; }  // *prints prompt (e.g. /bar/baz/ >) in every iteration of main loop // *show directories on path in correct order //void show_prompt(struct tree_node *cwd) {  //    while(cwd != null) { //       printf(cwd->string_buffer);        //show directories on path in correct order. //    }  //   printf("/"); //}  // *removes node child parent node dir // *take care correctly support corner cases child being 1 // *all memory occupied child should freed //void remove_child(struct tree_node *dir, struct tree_node *child) { //    if (dir == null) { //        printf("current directory empty!"); //    } //    else if (dir -> child != null) { //        free(child); //    } //}  // implement rmdir (follow same pattern previous exercise) // *if specified directory not empty, rmdir should fail error message //void do_rmdir(struct tree_node *cwd, char *arg) { //    if(cwd != null) { //        printf("specified directory not empty!"); //   } else { //        free(cwd); //    } //}  int main(void) {      char directoryname[129] = "";      printf("\nprogram start... \n\n");      // getting user input string     // , splitting command , argument     char inputstring[129];     char delimiter[] = " ";     char *line;     char *arg;     struct tree_node *root = make_tree_node("root\0");     //struct tree_node *cwd = make_tree_node("root\0");     struct tree_node *cwd = root;      printf("/%s >", directoryname);      while (fgets(inputstring, 128, stdin)) {          // char * before strsep, set pointer original checkstring         // original checkstring         // free memory           // gets argument , stores arg         line = malloc(strlen(inputstring) + 1);         strcpy(line, inputstring);         arg = strsep(&line, delimiter);         arg = strsep(&line, delimiter);         printf("your argument: %s\n", arg);          printf("/%s >", directoryname);          //printf("userinput:%s", inputstring);          if(strncmp(inputstring, "exit", 4) == 0) {             printf("breaking...\n");             break;         }          ////////////////////////////// handling ls ////////////////////////////          else if(strncmp(inputstring, "ls ", 3) == 0) {             printf("the ls command should used without arguments.\n");         }          else if(strncmp(inputstring, "ls", 2) == 0) {             do_ls(cwd);             printf("/%s >", directoryname);         }          ////////////////////////////// handing cd /////////////////////////////         else if(strncmp(inputstring, "cd ..", 5) == 0) {             printf("returning previous directory.\n");             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "cd .", 4) == 0) {             printf("returning current directory.\n");             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "cd ", 3) == 0) {             do_cd(cwd, root, arg);             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "cd", 2) == 0) {             printf("returning root directory.\n");             printf("/%s >", directoryname);         }          /////////////////////////// handling mkdir /////////////////////////////         else if(strncmp(inputstring, "mkdir  ", 7) == 0) {             printf("please specify directory name not null: mkdir directoryname\n");             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "mkdir ", 6) == 0) {             do_mkdir(cwd, arg);             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "mkdir", 5) == 0) {             printf("please specify directory name: mkdir directoryname\n");             printf("/%s >", directoryname);         }          //////////////////////// handling rmdir /////////////////////////////////         else if(strncmp(inputstring, "rmdir  ", 7) == 0) {             printf("please specify directory name not null: rmdir directoryname\n");             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "rmdir ", 6) == 0) {             printf("removing directory name...\n");             //             printf("/%s >", directoryname);         }         else if(strncmp(inputstring, "rmdir", 5) == 0) {             printf("please specify directory name: rmdir directoryname\n");             printf("/%s >", directoryname);         }         else {             printf("unrecognised input: please try again.\n");             printf("/%s >", directoryname);         }     }      printf("\nprogram quit... \n\n");       return 0; } 

you can use:

while (fgets(inputstring, 128, stdin)) {     inputstring[strlen(inputstring)-1] = '\0';     ... 

i try program change, output example:

program start...   / >mkdir hello argument: hello / >making directory name hello  directory added: hello/ > 

Comments

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -