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.
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.
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!
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.
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;
}
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)
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)
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)
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)
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)
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)
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)
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)
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)