Solved

Program not waiting for input

Posted on 2009-04-13
2
354 Views
Last Modified: 2012-06-21
Please view code below...

Using Bloodshed Dev-C++ 4.9.9.2 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?
a
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>
 

main()

{

    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

    printf("\n\n");

    

    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

    printf("\n\n");

    

    system("Pause");

    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)                           

              ptr++;

         else

         {

              *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

0
Comment
Question by:Geisrud
2 Comments
 
LVL 45

Accepted Solution

by:
Kdo earned 125 total points
Comment Utility
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,
Kent
0
 
LVL 14

Author Comment

by:Geisrud
Comment Utility
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:

letter=getch();

and I get results I can work with.
0

Featured Post

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

744 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now