Mandalika's scratchpad | [ Work blog @Oracle | My Music Compositions ] |
Old Posts: 09.04 10.04 11.04 12.04 01.05 02.05 03.05 04.05 05.05 06.05 07.05 08.05 09.05 10.05 11.05 12.05 01.06 02.06 03.06 04.06 05.06 06.06 07.06 08.06 09.06 10.06 11.06 12.06 01.07 02.07 03.07 04.07 05.07 06.07 08.07 09.07 10.07 11.07 12.07 01.08 02.08 03.08 04.08 05.08 06.08 07.08 08.08 09.08 10.08 11.08 12.08 01.09 02.09 03.09 04.09 05.09 06.09 07.09 08.09 09.09 10.09 11.09 12.09 01.10 02.10 03.10 04.10 05.10 06.10 07.10 08.10 09.10 10.10 11.10 12.10 01.11 02.11 03.11 04.11 05.11 07.11 08.11 09.11 10.11 11.11 12.11 01.12 02.12 03.12 04.12 05.12 06.12 07.12 08.12 09.12 10.12 11.12 12.12 01.13 02.13 03.13 04.13 05.13 06.13 07.13 08.13 09.13 10.13 11.13 12.13 01.14 02.14 03.14 04.14 05.14 06.14 07.14 09.14 10.14 11.14 12.14 01.15 02.15 03.15 04.15 06.15 09.15 12.15 01.16 03.16 04.16 05.16 06.16 07.16 08.16 09.16 12.16 01.17 02.17 03.17 04.17 06.17 07.17 08.17 09.17 10.17 12.17 01.18 02.18 03.18 04.18 05.18 06.18 07.18 08.18 09.18 11.18 12.18 01.19 02.19 05.19 06.19 08.19 10.19 11.19 05.20 10.20 11.20 12.20 09.21 11.21 12.22
.. with little commentary aside. Target audience: new programmers. These tips are equally applicable in C and C++ programming environments.
1. Duplicating a file pointer
Steps: find the integer file descriptor associated with the file stream using fileno()
call, make a copy of the file descriptor using dup()
call, and finally associate the file stream with the duplicated file descriptor by calling fdopen()
.
FILE *fptr = fopen("file", "mode"); FILE *fptrcopy = fdopen( dup( fileno(fptr) ), "mode");
2. Capturing the exit code of a command that was invoked using popen()
Using pipes is one way of executing commands programmatically that are otherwise invoked from a shell. While pipes are useful in performing tasks other than executing shell commands, this tip is mainly about the exit code of a command (to figure out whether it succeeded or failed) that was executed using popen()
API.
To capture the exit code, simply use the value returned by pclose()
. This function call returns the termination status of the command that was executed as a child process. However the termination status of the child process is in the top 16 bits of the return value, so dividing the pclose()
return value by 256 gives the actual exit code of the command that was executed.
... FILE *ptr; int rc; if ((ptr = popen("ls", "r")) != NULL) { rc = pclose(ptr)/256; printf("\nls: exit code = %d", rc); } if ((ptr = popen("ls -W", "r")) != NULL) { rc = pclose(ptr)/256; printf("\nls -W: exit code = %d", rc); } ... % ./<executable> ls: exit code = 0 ls: illegal option -- W ls -W: exit code = 2
3. Converting an integer to a string
Standard C library has implementation for converting a string to an integer (atoi()
), but not for converting an integer to a string. One way to achieve the desired result is by using sprintf()
function call, which writes formatted data to a string.
int weight = 30; char *wtstr = malloc(sizeof(char) * 3); sprintf(wtstr, "%d", weight); ...
sprintf()
can also be used to convert data in other data types such as float, double to string. Also see: man page for snprintf()
.
4. Finding the length of a statically allocated array
When size was not specified explicitly, simply divide the total size of the array by the size of the first array element.
eg.,static const char *greeting[] = { "Hi", "Hello", "Hola", "Bonjour", "Namaste", "Ciao", "Ni Hao" }; int numgreetings = sizeof(greeting)/sizeof(greeting[0]);
After execution, numgreetings
variable holds a value of 7. Note that sizeof(greeting[0])
is actually the size of a pointer to a character array.
sizeof
is not a function, but an operator -- hence it is not necessary or required to use parentheses when using it.
Labels: C programming tidbits tips
2004-2019 |