DI Management Home > C Programming

C Programming Language


This page is dedicated to the ANSI C Programming language. We've assembled links and copies of interesting or educational articles on C programming, look at Windows Win32 programming, and consider why we still prefer ANSI C to C++.

Contents

Why we prefer C to C++    Top

We note that many C++ programs we come across are really just plain old C with the printf replaced by cout<<.

Where C++ is better

Grudgingly, we have to admit that there are areas where C++ may be better. For example, using the overload operators would make something like a large digit arithmetic package much simpler to use. Having constructors and destructors means you can manage memory allocation and deletion more safely. And, er..., yes, we're sure there really are more reasons.

"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg."
- Bjarne Stroustrup

"If C gives you enough rope to hang yourself, then C++ gives you enough rope to bind and gag your neighborhood, rig the sails on a small ship, and still have enough rope to hang yourself from the yardarm"
- Anonymous quote from the The UNIX-HATERS Handbook

C Sharp: You could skip C++ altogether and go straight to C#. In earlier versions of this page we may have given the impression we were completely against C# but after carrying out some projects in C# we are partially converted. Perhaps it's not just a proprietary Microsoft language after all, and there are alternative compilers out there, some not even provided by M$. C# has all the advantages of C (well, most) without the buffer overflow and garbage collection problems. We still wouldn't invest in a big project in it, though. You can find code written 30 years ago in C and it still works. Who knows, the code you write today in C# may even work on the new version that Microsoft brings out next week. And it certainly won't work on any platforms other than the big W!

D: Look instead at the D Programming Language.

Recommended books on the C Programming Language    Top

If you read and understand the first three of these books, you will be an expert in C, I promise you. Plauger is a useful reference book that makes up the set. And better, all four of them will span no more than 4 inches on your book shelf.

For more advanced users, try C Interfaces and Implementations: techniques for creating reusable software by David R. Hanson, Addison-Wesley, 1997. The source code and sample pages are available at <http://www.cs.princeton.edu/software/cii/>.

Secure Programming in C    Top

For a good introduction see Secure Programming in C and C++ by Robert C. Seacord, Addison-Wesley, 2005, <http://www.cert.org/books/secure-coding/>. This not only explains clearly what the problems are but provides useful links. For a more detailed work with lots of instantly useable examples for both Windows and Unix, try Secure Programming Cookbook for C and C++ by John Viega and Matt Messier, O'Rielly Media, 2003. The authors provide more information, links and downloads on their site <http://www.secureprogramming.com/>.

Look at the GIAC Secure Software Programmer (GSSP) Certification Exam developed in a joint effort involving the SANS Institute, CERT/CC, several US government agencies. For more information see GSSP Certification Exam. David Ireland was one of the first seven programmers to receive this qualification in C, see SANS Institute press release.

Win32 Programming using C    Top

A personal story: I struggled for months to learn Windows programming with my (then) new copy of MSVC++5. I bought lots of books and followed their examples, but just didn't seem to get it.

Once you'd set up a simple example, such as "Hello World", it was very difficult to make simple changes to create a more complicated example. The object-oriented C++ syntax combined with MFC's attempts to hide the messy bits of Win32 programming made it difficult to trace and understand. Because you'd used wizards to set it all up, you didn't understand why things did what they did. The books all relied on pages and pages of screen dumps of the setup screens to explain what had to be done in a cookbook "follow the recipe" manner. So even if you remembered it perfectly, once you changed environment, you'd be lost again.

The one thing that made it all come together was finding the GENERIC.C example in the Windows SDK (currently at generic.c, unless they've moved it again - thanks, John). Here was a simple example of relatively few lines that worked. What's more, it didn't get complicated by introducing the extra complexities of C++. Better still, you didn't need to use macros to set things up and so could actually alter what you wanted to do without starting again.

The upshot is that the hardest bit about Win32 programming is the first bit. If you understand the basics of the WinMain loop, WM_CREATE, WM_PAINT, and the use of callback functions, you are a long way there. There is a standard wrapper about 30 lines long that you can use. Everything else generally comes down to finding the right Windows functions to use to do what you want (ironically, the best place to find this information and how to use it is often on a VB site!).

Personally I find that programming in plain Win32 C makes for smaller and neater programs. From what we can see, nothing fundamental has changed between Win95 and XP from a standard programmer's point of view. Sure, there are more features and more complexity if you go looking, but the basics are unchanged. A text book on W95 is still quite valid for writing programs that will run on XP. It gets messier when you want to start using WinSock or doing fancy graphics programming. Presumably the next big change will be when the 64-bit variant supersedes the 32-bit one.

Free software: See our free Wclock world time display program written using straightforward ANSI C and so-called "SDK-C", i.e. the C code used in the Windows SDK. The source code is available. New 1 Jan 2008New version released on 1 January 2008.

Recommended books on Win32 Programming in C    Top

Recommended sites on Win32 Programming in C    Top

We have found these sites to be particularly helpful for learning and understanding Win32 programming using the C programming language.

Avoiding buffer overflows - strlcpy and strlcat    Top

It is not wise to use the ANSI standard strcpy function because of the possibility of unchecked buffer overflows. The better strncpy function has the problem that it does not properly terminate the string. The following strlcpy and strlcat functions are simple implementations that manage the problems of their original ANSI ancestors.
#include <string.h>

size_t strlcpy(char *d, const char *s, size_t bufsize)
{
	size_t len;
	size_t ret;
	
	if (!d || !s) return 0;
	len = strlen(s);
	ret = len;
	if (bufsize <= 0) return 0;
	if (len >= bufsize) len = bufsize-1;
	memcpy(d, s, len);
	d[len] = 0;
	
	return ret;
}

size_t strlcat(char *d, const char *s, size_t bufsize)
{
	size_t len1;
	size_t len2;
	size_t ret;
	
	if (!d || !s || bufsize <= 0) return 0;
	
	len1 = strlen(d);
	len2 = strlen(s);
	ret = len1 + len2;
	if (len1+len2 >= bufsize) 
	{
		len2 = bufsize - (len1+1);
	}
	if (len2 > 0) 
	{
		memcpy(d+len1, s, len2);
		d[len1+len2] = 0;
	}
	return ret;
}
Updated: 27 December 2003 by adding checks for null strings.

Interestingly, we found a much more complicated version of these functions somewhere on the net. The fact that it had typos in it and wouldn't compile straightaway didn't fill us with confidence. This version is cleaner.

For more on the principles behind their design and advice on their usage see strlcpy and strlcat - consistent, safe, string copy and concatenation by Todd C. Miller and Theo de Raadt.

Windows programmers should refer to Microsoft's Using the Strsafe.h Functions. As with all Microsoft's pages, it may have moved again.

We also like to use this modified version of strlen when users might send us a null string

size_t strllen(const char *string)
{
	if (!string) return 0;
	return strlen(string);
}

More on buffer overflows - MSVC's _snprintf function    Top

The functions sprintf and Win32 wsprintf have similar problems with buffer overflow. The snprintf function provided in (recent) Unix implementations like GCC solve the problem admirably. In MSVC there is a similarly named _snprintf function that you'd expect to do the same thing, wouldn't you? Wrong! Spot the difference:

Unix: The snprintf() function will write at most size-1 of the characters printed into the output string (the size'th character then gets the terminating `\0'); if the return value is greater than or equal to the size argument, the string was too short and some of the printed characters were discarded. The output is always null-terminated.

MSVC: _snprintf returns the number of bytes stored in buffer, not counting the terminating null character. If the number of bytes required to store the data exceeds count, then count bytes of data are stored in buffer and a negative value is returned.

Can you see the problem? In the Unix version, the output is always null-terminated. In MSVC, it's not.

Here's a compromise solution we use in MSVC environments. It returns a negative value on overflow instead of the required number but the output is always null-terminated.

#include <stdio.h>
#include <stdarg.h>
int slprintf(char *buffer, size_t count, const char *fmt, ...)
{
	va_list ap;
	int ret;

	va_start(ap, fmt);
	ret = _vsnprintf(buffer, count-1, fmt, ap);
	if (ret < 0)
		buffer[count-1] = '\0';
	va_end(ap);
	return ret;
}

Some cute programs in C    Top

Calculate pi to 800 digits in 160 characters of code. Written by Dik T. Winter at CWI.

    int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5;
    for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,
    f[b]=d%--g,d/=g--,--b;d*=b);}

Calculate the day of the week in 45 characters of code. Written by Mike Keith.

    (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7

Diffie-Helman in 10 lines of code posted anonymously to sci.crypt and publicised by Adam Back. This actually carries out multiple precision modular exponentation using 8-bit digits. Set S to the number of 8-bit digits required plus 1. This example is for 1024 bits.

#include <stdio.h>  /* Usage: dh base exponent modulus */
typedef unsigned char u;u m[1024],g[1024],e[1024],b[1024];int n,v,d,z,S=129;a(
u *x,u *y,int o){d=0;for(v=S;v--;){d+=x[v]+y[v]*o;x[v]=d;d=d>>8;}}s(u *x){for(
v=0;(v<S-1)&&(x[v]==m[v]);)v++;if(x[v]>=m[v])a(x,m,-1);}r(u *x){d=0;for(v=0;v<
S;){d|=x[v];x[v++]=d/2;d=(d&1)<<8;}}M(u *x,u *y){u X[1024],Y[1024];bcopy(x,X,S
);bcopy(y,Y,S);bzero(x,S);for(z=S*8;z--;){if(X[S-1]&1){a(x,Y,1);s(x);}r(X);a(Y
,Y,1);s(Y);}}h(char *x,u *y){bzero(y,S);for(n=0;x[n]>0;n++){for(z=4;z--;)a(y,y
,1);x[n]|=32;y[S-1]|=x[n]-48-(x[n]>96)*39;}}p(u *x){for(n=0;!x[n];)n++;for(;n<
S;n++)printf("%c%c",48+x[n]/16+(x[n]>159)*7,48+(x[n]&15)+7*((x[n]&15)>9));
printf("\n");}main(int c,char **v){h(v[1],g);h(v[2],e);h(v[3],m);bzero(b,S);b[
S-1]=1;for(n=S*8;n--;){if(e[S-1]&1)M(b,g);M(g,g);r(e);}p(b);}
Note: For strict ANSI you need to add #include <string.h> and substitute memset(x,0,S) and memcpy(y,Y,S) for the bzero() and bcopy() functions above (or write your own loops).

The Best One Liner winner in the 1987 International Obfuscated C Code Contest (IOCCC), written by David Korn and judged "the best one line entry ever received".

main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
This should compile without changes on a Unix or Cygwin system. If you are stuck, here are some hints to help understand how it works.

Free programs and utilities to download    Top

Some interesting articles    Top

These are interesting articles or links on C Programming that we've stumbled across in the last few years. If there wasn't a valid link to the original site, then the articles are posted here as an educational aid. We don't intend to infringe anyone's copyright here. If you are the original author and have a problem with any of these articles being posted here, please contact us and we'll remove it or replace it with a link to your site.

Interview with Brian Kernighan Enjoyable reading with some support for our views on C++. Plus advice on how to pronounce his name correctly.
comp.lang.c Frequently Asked Questions Link to www version. Highly relevant. An up-to-date copy may be obtained from ftp.eskimo.com in directory u/s/scs/C-faq/.
ANSI C Programming Lanuage A useful short help on C Programming, including precedence and the preprocessor, by Ross L Richardson.
ANSI C Standard Library Summary of the ANSI C standard library functions.
Standard C programming This document by P.J. Plauger and Jim Brodie provides all the information you need to read and write programs in the Standard C programming language. (Thanks to Josef Liebl for this link).
Rationale for C90 ANSI C A link to the original Rationale for American National Standard for Information Systems - Programming Language - C. This was included in the original ANSI standard explaining why things were done as they were. It was unfortunately dropped from the ISO standard.
C99 Standard The last public draft of the C99 standard (ISO/IEC 9899:1999) is available from the JTC1/SC22/WG14-C site as well as the Technical Corrigenda and the Rational for the C99 standard.
The C Programming Language A useful collection of links related to the C programming language.
Style in C Rob Pike's set of essays on coding style and a "philosophy of clarity in programming" as opposed to laying down hard rules.
C Traps and pitfalls An essay by Andrew Koenig of AT&T Bell Labs written as the basis to his book C Traps and Pitfalls. "The C language is like a carving knife: ... This paper shows some of the ways C can injure the unwary, and how to avoid injury." Worth reading (and then re-reading).
Incompatibilities Between C and C++ David R. Tribble's detailed listings of incompatibilities between ISO C and ISO C++.
How To Steal Code Henry Spencer's article on inventing the wheel only once. "Never build what you can (legally) steal! Done right, it yields better programs for less work". There are some useful C programs at the end.
The Ten Commandments for C Programmers Henry Spencer's amusing, but true, adaptation of the ten commandments for C programmers. We love number 6: If a function be advertised to return an error code in the event of difficulties, thou shalt check for that code, yea, even though the checks triple the size of thy code and produce aches in thy typing fingers, for if thou thinkest ``it cannot happen to me'', the gods shall surely punish thee for thy arrogance. Read and take note.
How to write unmaintainable code A link to Roedy Green's very amusing article on how to guarantee a lifetime's employment by making life impossible for maintenance programmers. (He actually has to explain that it's a joke!) Although focused on Java, he gives plenty of examples in C. If you give someone a program, you will frustrate them for a day; if you teach them how to program, you will frustrate them for a lifetime. More quotes below.

Quotes from How to write unmaintainable code    Top

Testing is for cowards: A brave coder will bypass that step. Too many programmers are afraid of their boss, afraid of losing their job, afraid of customer hate mail and afraid of being sued. This fear paralyzes action, and reduces productivity. Studies have shown that eliminating the test phase means that managers can set ship dates well in advance, an obvious aid in the planning process. With fear gone, innovation and experimentation can blossom. The role of the programmer is to produce code, and debugging can be done by a cooperative effort on the part of the help desk and the legacy maintenance group.

Never, Ever Do Any Performance Testing: Hey, if it isn't fast enough, just tell the customer to buy a faster machine. If you did do performance testing, you might find a bottleneck, which might lead to algorithm changes, which might lead to a complete redesign of your product. Who wants that? Besides, performance problems that crop up at the customer site mean a free trip for you to some exotic location. Just keep your shots up-to-date and your passport handy.

Never Validate: Never check input data for any kind of correctness or discrepancies. It will demonstrate that you absolutely trust the company's equipment as well as that you are a perfect team player who trusts all project partners and system operators. Always return reasonable values even when data inputs are questionable or erroneous.

Quotes from How to write unmaintainable code by Roedy Green.

Contact

For more information, please Email Us. To comment on this page, see below.

This page last updated 1 January 2010

Comments

Post a comment on this page.

7 comments so far

Thank you for this great site, and for your wisdom.

C is to programming what minimalism is to art. There is something peaceful or calming about a language which is transparent, honest, and succinct. It allows the programmer - the code artist - to be in control of what paint goes on the canvas.

And as you mention programs written in C have the quality of longevity, or to quote Christopher Alexander, a "timeless way" about them.

Guys, keep up the great work.

Mark Horner | Melbourne, Australia - Sun, Jan 24 2010 04:12 GMT

I never liked C until I started working on microcontrollers and I must say, I have come to discover its utility as a really powerful mid-level programming language.

And it is great to find such a good site with good many excellent references.

Mahder Tewolde | New York, NY - Sat, Feb 27 2010 02:36 GMT

Wow! this is a great site!

"C is simpler and more compact" "The reference book is thinner"

I think that is so important in a programming language...

Good job guys.

Javier | Spain - Sat, Apr 17 2010 02:08 GMT

please you make some more easy way to express language'c'.

venkatesh kumar | - Thu, May 6 2010 05:17 GMT

C definitely is a very simple, yet powerful language. I now can create some GUI from winprog tuts, which had me cry in the beginning, but steadily making me happier all the way.

This article has boosted me more to work on C programming in Windows.

Vijay Kanta | Hyderabad, India - Sat, Jun 5 2010 11:20 GMT

great job !! It is just like a complete package to understand ''what is C language''. I appreciate this commendable work. Hearty congratulations 2 u guys...

Pooja gupta | Saharanpur, INDIA - Mon, Jul 12 2010 10:23 GMT

Such a great piece of information in one page. Thanks a lot for sharing it with the world !!!

ganesh | - Sat, Aug 21 2010 20:25 GMT