Pure C function pointer on printing vowels twice


 
Thread Tools Search this Thread
Top Forums Programming Pure C function pointer on printing vowels twice
# 8  
Old 05-17-2017
Quote:
Originally Posted by yifangt
What I meant is: Does putchar(c) == EOF have two layers?
First,
[COLOR=#170072][FONT=monospace]putchar(c), which will print 'c' out;
Second, evaluate putchar(c) == EOF, which is false because first step is successful.
To get the return value of a function, the function must first be executed, yes.

Quote:
How does 'e' get printed twice in 'Test'? I need each step through the code.
Code:
if(putchar(c) == EOF || putchar(c) == EOF)
if('C' == EOF || putchar(c) == EOF)
if(false || putchar(c) == EOF)
if(putchar(c) == EOF)
if('C' == EOF)
if(false)

Now, if putchar actually DID return eof, it'd ignore the other half. It doesn't need to bother, since true || anything means true. That's why they call || short-circuit evaluation, it can quit early.

Code:
if(putchar(c) == EOF || putchar(c) == EOF)
if(EOF == EOF || putchar(c) == EOF)
if(true || putchar(c) == EOF)
if(true)

# 9  
Old 05-17-2017
I think I can get the logic part, but not the 'ee' from Test to Teest'.
I re-wrote the code to avoid any possible confusion just simply printing each char twice:
Code:
#include <stdio.h>
#include <stdlib.h>

/*Print a char twice like putchar, return char if successful, or EOF on error.*/

int putcharTwice(int c)
{
    if (putchar(c) == EOF || putchar(c) == EOF)  {
    return EOF;
    } else {
    putchar(c);  //explicit printing
    putchar(c);  //explicit printing
    return 0;
    }
}

int main(int argc, char **argv)
{
    int c;

    while ((c = getchar()) != EOF) {
    putcharTwice(c); 
     }
    return 0;
}

but the code actually print each char FOUR times!
Code:
$ echo Test | ./a.out
TTTTeeeesssstttt.

Apparently every last two repeats are from the explicit printing. Where are the first two repeats from?
Sorry for my slow catch!

Last edited by yifangt; 05-17-2017 at 05:27 PM..
# 10  
Old 05-17-2017
You have a big array of pointers which determines which function gets called. It executes different code because a few pointers point to a different location in memory.

The value of table['a'], or any other vowel, is 0x400656. That's a location in memory which gets jumped to, containing the instructions for the putcharTwice function. All other indexes contain 0x400500, which is just putchar.
This User Gave Thanks to Corona688 For This Post:
# 11  
Old 05-17-2017
Quote:
Originally Posted by yifangt
...but the code actually print each char FOUR times!
That's because you call putchar() four times. Not sure what you were expecting.

How could an expression possibly work without calling the functions mentioned in it? It couldn't.
# 12  
Old 05-17-2017
Thanks Don and corona688!
I think my problem is my mis-understanding of the function putchar(c) so that I re-wrote it with putc() which helped me understand it.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>

/*Print a char twice like putchar, return char if successful, or EOF on error.*/

int putcharTwice(int c)
{
    if (putc(c, stdout) == EOF || putc(c, stdout) == EOF)  {//Q1
    return EOF;
    } else {
    return 0;        //NOT return c;
    }
}

#define NUM_CHARS (UCHAR_MAX + 1)    //UCHAR_MAX is in limits.h

  int (*table[NUM_CHARS]) (int);   //Q2, So moved outside main() to see this function pointer

int main(int argc, char **argv)
{
/*This declares table as array of function pointers */
    int i;
    int c;

    for (i = 0; i < UCHAR_MAX; i++) {
    // default is to call putchar 
    table[i] = putchar;
    }

    // but lower-case vowels show up twice 
    table['a'] = putcharTwice; //Q3, and following 4 lines
    table['e'] = putcharTwice; //Q3
    table['i'] = putcharTwice; //Q3
    table['o'] = putcharTwice; //Q3
    table['u'] = putcharTwice; //Q3

    while ((c = getchar()) != EOF) {
    table[c] (c); //Q4,
    }
    return 0;
}

Thanks a lot again!
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Segmentation fault when I pass a char pointer to a function in C.

I am passing a char* to the function "reverse" and when I execute it with gdb I get: Program received signal SIGSEGV, Segmentation fault. 0x000000000040083b in reverse (s=0x400b2b "hello") at pointersExample.c:72 72 *q = *p; Attached is the source code. I do not understand why... (9 Replies)
Discussion started by: jose_spain
9 Replies

2. UNIX for Dummies Questions & Answers

Counting vowels in string. "Comparison pointer-integer".

I'm trying to write a programme which scans strings to find how many vowels they contain. I get an error saying that I'm trying to compare a pointer and an integer inif(*v == scanme){. How can I overcome this ? Also, the programme seems to scan only the first word of a string e.g.: if I type "abc... (1 Reply)
Discussion started by: fakuse
1 Replies

3. Programming

Trivial doubt about C function pointer

Hi, In the below C code, #include <stdio.h> void print() { printf("Hello\n"); } int main() { void (*f)() = (void (*)()) print; f(); (*f)(); } I wonder, how the syntaxes "f()" and "(*f)()" are treated as same without any error? Is this an improvement or ANSI/ISO... (1 Reply)
Discussion started by: royalibrahim
1 Replies

4. Programming

structure pointer array as function parameters

if i create an array of pointers to a structure "struct node" as: struct node *r; and create "n" number of "linked lists" and assign it to the various struct pointers r using some function with a return type as structure pointer as: r=multiplty(.......) /*some parameters*/ is... (2 Replies)
Discussion started by: mscoder
2 Replies

5. UNIX for Dummies Questions & Answers

Printing pointer address

How can I print the memory address of a pointer using printf (or any other STDOUT functions?). I see in Linux its %p but not in unix, help? thanks (5 Replies)
Discussion started by: perleo
5 Replies

6. Programming

Function Returning Pointer

Hi guys. how a functions such fdopen, ... can return pointer? are these functions use static memory(variables)? (6 Replies)
Discussion started by: majid.merkava
6 Replies

7. Programming

Function pointer to inline function ?

Hi. Problem: I have to parse the payload of a packet. The payload could be in Big Endian Format (network byte order) or little. That depends on a flag present in the header of the packet. Solution: A horrible solution could be to check for that flag everytime I have to read a field in the... (11 Replies)
Discussion started by: emitrax
11 Replies

8. Programming

How to return void function pointer

Hello all im trying to build function that will return void function pointer what is mean is ( not working ) the main function void * myClass::getFunction(int type){ if(type==1) return &myClass::Test1; if(type==2) return &myClass::Test2; } void myClass::Test1(){... (1 Reply)
Discussion started by: umen
1 Replies

9. Programming

Pure Virtual Function in C++

Dear All, Here I want to know why we put =0 in case of pure virtual function, why not =1, =2 or any thing else Please send me answer any one as soon as possible. (1 Reply)
Discussion started by: krishna_sicsr
1 Replies

10. Programming

Problem with function which reutrns pointer to a value

i have a function: char *pcCityIdToCountryName(ADMIN_DB_DATA *pstHEader, unit uiCityID) this returns a pointer to CountryName if cityId is given. to retrieve countryname i give: char *CountryName; CountryName = pcCityIdToCountryName(..................); but when i compile it is giving :... (5 Replies)
Discussion started by: jazz
5 Replies
Login or Register to Ask a Question