Program not waiting for input

Posted on 2009-04-13
Medium Priority
Last Modified: 2012-06-21
Please view code below...

Using Bloodshed Dev-C++ compiler...

I'm curious why when I compile and run my code the first section involving string s1 runs just fine; prints string, asks what char I want (the letter 'a' in this case- passes to function, etc.

next section, s2, doesn't ask what char I want.  It prints string, prints "Letter to be removed", then prints string again.  Output below:

String is: abracadabra
Letter to be removed?
String is: brcdbr

String is: abracadabra
Letter to be removed?
String is: abracadabra

Press any key to continue . . .

I copied and pasted the code from s1, and only changed s1 to s2, so I don't understand why this is happening.  
Using pointers, write a function, rmchr, that takes a string and a character as 
arguments, removing all occurrences of the character from the string, watching 
for sequential occurences.  rmchr should not leave holes in the string.
Put the string both before and after the call to rmchr to demonstrate that the 
original string was modified
#include <stdio.h>
#include <string.h>
    void rmchr(char string[], char remove);     //function to remove a character
    void printstring(const char string[]);      //function to print a string
    char s1[]="abracadabra";                          //test string s1-s5
    char s2[]="abracadabra";                          
    char s3[]="abracadabra";                          
    char s4[]="aaaa";                                 
    char s5[]="aaaa";                                 
    char letter;                                      //letter to be removed
    printstring(s1);                                  //print original string
    printf("Letter to be removed?\n");
    scanf("%c", &letter);                             //gets letter to remove
    rmchr(s1, letter);                                //calls function, passes variables
    printstring(s1);                                  //print altered string
    printstring(s2);                                  //print original string
    printf("Letter to be removed?\n");
    scanf("%c", &letter);                             //gets letter to remove
    rmchr(s2, letter);                                //calls function, passes variables
    printstring(s2);                                  //print altered string
    return 0;
//function to remove a letter
void rmchr(char string[], char remove)
    char temp[strlen(string+1)];                      //temp array
    char *ptr = string;                               //pointer to start of string
    char *endptr = string + strlen(string);           //pointer to end of string
    char *tempptr = temp;                             //pointer to start of temp string
    while(ptr != endptr)
         if(*ptr == remove)                           
              *tempptr = * ptr;                       //copies letter to temp string
              ptr++;                                  //if it doesn't match char 
              tempptr++;                              //to remove
    *tempptr = '\0';                                  //null 0 at end of temp string
    strcpy(string, temp);                             //copies to original string
//function to print string
void printstring(const char string[])
     printf("String is: %s\n", string);               

Open in new window

Question by:Geisrud
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 46

Accepted Solution

Kent Olsen earned 500 total points
ID: 24131873
Hi Geisrud,

You have to be very careful of newline characters.  When you call scanf() or any of its sister functions, input is scanned until a character that does not match for the format string is found.  If the format specifier is a string type, the rest of the string is copied, just as you'd expect.

But if the format specifier is numeric (d, i, f, etc.) the scan stops at the first non-digit and the character is kept in the buffer to be used as the first character of the next read operation.  Irritatingly, this includes newline characters.

You'll need to modify the scanf() statement so that it skips the trailing newline.  Either that or call fflush(stdin) before pausing at the scanf().

Good Luck,
LVL 14

Author Comment

ID: 24132271
I guess I don't 100% understand what's going on with that (just more thought required on my part...), but I changed my scanf statement (lines 29 and 36 in my code sample) to a getch statement:


and I get results I can work with.

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
Suggested Courses

801 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question