Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Những câu hỏi thường gặp trong C (tiếng Anh - không giải đáp)

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Post Những câu hỏi thường gặp trong C (tiếng Anh - không giải đáp)

    1. Declarations and Initializations

    1.1 How should I decide which integer type to use?

    1.2 Why aren't the sizes of the standard types precisely defined?

    1.3 Since C doesn't define sizes exactly, I've been using typedefs like int16 and int32. I can then define these typedefs to be int, short, long, etc. depending on what machine I'm using. That should solve everything, right?

    1.4 What should the 64-bit type be on a machine that can support it?

    1.5 What's wrong with this declaration?

    char* p1, p2;

    I get errors when I try to use p2.

    1.6 I'm trying to declare a pointer and allocate some space for it, but it's not working. What's wrong with this code?

    char *p;
    *p = malloc(10);

    1.7 What's the best way to declare and define global variables and functions?

    1.8 How can I implement opaque (abstract) data types in C?

    1.9 How can I make a sort of ``semi-global'' variable, that is, one that's private to a few functions spread across a few source files?

    1.10 Do all declarations for the same static function or variable have to include the storage class static?

    1.11 What does extern mean in a function declaration?

    1.12 What's the auto keyword good for?

    1.13 What's the difference between using a typedef or a #define for a user-defined type?

    1.14 I can't seem to define a linked list successfully. I tried

    typedef struct {
    char *item;
    NODEPTR next;
    } *NODEPTR;

    but the compiler gave me error messages. Can't a structure in C contain a pointer to itself?

    1.15 How can I define a pair of mutually referential structures? I tried

    typedef struct {
    int afield;
    BPTR bpointer;
    } *APTR;

    typedef struct {
    int bfield;
    APTR apointer;
    } *BPTR;

    but the compiler doesn't know about BPTR when it is used in the first structure declaration.

    1.16 What's the difference between these two declarations?

    struct x1 { ... };
    typedef struct { ... } x2;

    1.17 What does

    typedef int (*funcptr)();

    mean?

    1.18 I've got the declarations

    typedef char *charp;
    const charp p;

    Why is p turning out const, instead of the characters pointed to?

    1.19 I don't understand why I can't use const values in initializers and array dimensions, as in

    const int n = 5;
    int a[n];

    1.20 What's the difference between const char *p, char const *p, and char * const p?

    1.20b

    What does it mean for a function parameter to be const? What do the two const's in

    int f(const * const p)

    mean?

    1.21 How do I construct declarations of complicated types such as ``array of N pointers to functions returning pointers to functions returning pointers to char'', or figure out what similarly complicated declarations mean?

    1.22 How can I declare a function that can return a pointer to a function of the same type? I'm building a state machine with one function for each state, each of which returns a pointer to the function for the next state. But I can't find a way to declare the functions--I seem to need a function returning a pointer to a function returning a pointer to a function returning a pointer to a function..., ad infinitum.

    1.23 Can I declare a local array (or parameter array) of a size matching a passed-in array, or set by another parameter?

    1.24 I have an extern array which is defined in one file, and used in another:

    file1.c: file2.c:

    int array[] = {1, 2, 3}; extern int array[];

    Why doesn't sizeof work on array in file2.c?

    1.25 My compiler is complaining about an invalid redeclaration of a function, but I only define it once and call it once.

    1.25b What's the right declaration for main?
    Is void main() correct?

    1.26 My compiler is complaining about mismatched function prototypes which look fine to me.

    1.27 I'm getting strange syntax errors on the very first declaration in a file, but it looks fine.

    1.28 My compiler isn't letting me declare a big array like

    double array[256][256];

    1.29 How can I determine which identifiers are safe for me to use and which are reserved?

    1.30 What am I allowed to assume about the initial values of variables and arrays which are not explicitly initialized?
    If global variables start out as ``zero'', is that good enough for null pointers and floating-point zeroes?

    1.31 This code, straight out of a book, isn't compiling:

    int f()
    {
    char a[] = "Hello, world!";
    }

    1.31b What's wrong with this initialization?

    char *p = malloc(10);

    My compiler is complaining about an ``invalid initializer'', or something.

    1.32 What is the difference between these initializations?

    char a[] = "string literal";
    char *p = "string literal";

    My program crashes if I try to assign a new value to p[i].

    1.33 Is char a[3] = "abc"; legal?

    1.34 I finally figured out the syntax for declaring pointers to functions, but now how do I initialize one?

    1.35 Can I initialize unions?
    2. Structures, Unions, and Enumerations

    2.1 What's the difference between these two declarations?

    struct x1 { ... };
    typedef struct { ... } x2;

    2.2 Why doesn't

    struct x { ... };
    x thestruct;

    work?

    2.3 Can a structure contain a pointer to itself?

    2.4 How can I implement opaque (abstract) data types in C?

    2.4b Is there a good way of simulating OOP-style inheritance, or other OOP features, in C?

    2.5 Why does the declaration

    extern int f(struct x *p);

    give me an obscure warning message about ``struct x declared inside parameter list''?

    2.6 I came across some code that declared a structure like this:

    struct name {
    int namelen;
    char namestr[1];
    };

    and then did some tricky allocation to make the namestr array act like it had several elements, with the number recorded by namelen. How does this work? Is it legal or portable?

    2.7 I heard that structures could be assigned to variables and passed to and from functions, but K&R1 says not.

    2.8 Is there a way to compare structures automatically?

    2.9 How are structure passing and returning implemented?

    2.10 How can I pass constant values to functions which accept structure arguments? How can I create nameless, immediate, constant structure values?

    2.11 How can I read/write structures from/to data files?

    2.12 Why is my compiler leaving holes in structures, wasting space and preventing ``binary'' I/O to external data files? Can I turn this off, or otherwise control the alignment of structure fields?

    2.13 Why does sizeof report a larger size than I expect for a structure type, as if there were padding at the end?

    2.14 How can I determine the byte offset of a field within a structure?

    2.15 How can I access structure fields by name at run time?

    2.16 Does C have an equivalent to Pascal's with statement?

    2.17 If an array name acts like a pointer to the base of an array, why isn't the same thing true of a structure?

    2.18 This program works correctly, but it dumps core after it finishes. Why?

    struct list {
    char *item;
    struct list *next;
    }

    /* Here is the main program. */

    main(argc, argv)
    { ... }

    2.19 What's the difference between a structure and a union, anyway?

    2.20 Can I initialize unions?

    2.21 Is there an automatic way to keep track of which field of a union is in use?

    2.22 What's the difference between an enumeration and a set of preprocessor #defines?

    2.23 Are enumerations really portable?
    Aren't they Pascalish?

    2.24 Is there an easy way to print enumeration values symbolically?

    2.25 I came across some structure declarations with colons and numbers next to certain fields, like this:

    struct record {
    char *name;
    int refcount : 4;
    unsigned dirty : 1;
    };

    What gives?

    2.26 Why do people use explicit masks and bit-twiddling code so much, instead of declaring bit-fields?
    3. Expressions

    3.1 Why doesn't this code:

    a[i] = i++;

    work?

    3.2 Under my compiler, the code

    int i = 7;
    printf("%d\n", i++ * i++);

    prints 49. Regardless of the order of evaluation, shouldn't it print 56?

    3.3 I've experimented with the code

    int i = 3;
    i = i++;

    on several compilers. Some gave i the value 3, and some gave 4. Which compiler is correct?

    3.3b Here's a slick expression:

    a ^= b ^= a ^= b

    It swaps a and b without using a temporary.

    3.4 Can I use explicit parentheses to force the order of evaluation I want, and control these side effects? Even if I don't, doesn't precedence dictate it?

    3.5 But what about the && and || operators?
    I see code like ``while((c = getchar()) != EOF && c != '\n')'' ...

    3.6 Is it safe to assume that the right-hand side of the && and || operators won't be evaluated if the left-hand side determines the outcome?

    3.7 Why did

    printf("%d %d", f1(), f2());

    call f2 first? I thought the comma operator guaranteed left-to-right evaluation.

    3.8 How can I understand complex expressions like the ones in this section, and avoid writing undefined ones? What's a ``sequence point''?

    3.9 So if I write

    a[i] = i++;

    and I don't care which cell of a[] gets written to, the code is fine, and i gets incremented by one, right?

    3.10a People keep saying that the behavior of i = i++ is undefined, but I just tried it on an ANSI-conforming compiler, and got the results I expected.

    3.10b People told me that if I evaluated an undefined expression, or accessed an uninitialized variable, I'd get a random, garbage value. But I tried it, and got zero. What's up with that?

    3.11 How can I avoid these undefined evaluation order difficulties if I don't feel like learning the complicated rules?

    3.12a What's the difference between ++i and i++?

    3.12b If I'm not using the value of the expression, should I use ++i or i++ to increment a variable?

    3.13 I need to check whether one number lies between two others. Why doesn't

    if(a < b < c)

    work?

    3.14 Why doesn't the code

    int a = 1000, b = 1000;
    long int c = a * b;

    work?

    3.14b How can I ensure that integer arithmetic doesn't overflow?

    3.15 Why does the code

    double degC, degF;
    degC = 5 / 9 * (degF - 32);

    keep giving me 0?

    3.16 I have a complicated expression which I have to assign to one of two variables, depending on a condition. Can I use code like this?

    ((condition) ? a : b) = complicated_expression;

    3.17 I have some code containing expressions like

    a ? b = c : d

    and some compilers are accepting it but some are not.

    3.18 What does the warning ``semantics of `>' change in ANSI C'' mean?

    3.19 What's the difference between the ``unsigned preserving'' and ``value preserving'' rules?
    4. Pointers

    4.1 What are pointers really good for, anyway?

    4.2 I'm trying to declare a pointer and allocate some space for it, but it's not working. What's wrong with this code?

    char *p;
    *p = malloc(10);

    4.3 Does *p++ increment p, or what it points to?

    4.4 I'm trying to use pointers to manipulate an array of ints. What's wrong with this code?

    int array[5], i, *ip;
    for(i = 0; i < 5; i++) array[i] = i;
    ip = array;
    printf("%d\n", *(ip + 3 * sizeof(int)));

    I expected the last line to print 3, but it printed garbage.

    4.5 I have a char * pointer that happens to point to some ints, and I want to step it over them. Why doesn't

    ((int *)p)++;

    work?

    4.6 Why can't I perform arithmetic on a void * pointer?

    4.7 I've got some code that's trying to unpack external structures, but it's crashing with a message about an ``unaligned access.'' What does this mean?

    4.8 I have a function which accepts, and is supposed to initialize, a pointer:

    void f(int *ip)
    {
    static int dummy = 5;
    ip = &dummy;
    }

    But when I call it like this:

    int *ip;
    f(ip);

    the pointer in the caller remains unchanged.

    4.9 Suppose I want to write a function that takes a generic pointer as an argument and I want to simulate passing it by reference. Can I give the formal parameter type void **, and do something like this?

    void f(void **);
    double *dp;
    f((void **)&dp);

    4.10 I have a function

    extern int f(int *);

    which accepts a pointer to an int. How can I pass a constant by reference? A call like

    f(&5);

    doesn't seem to work.

    4.11 Does C even have ``pass by reference''?

    4.12 I've seen different syntax used for calling functions via pointers. What's the story?

    4.13 What's the total generic pointer type? My compiler complained when I tried to stuff function pointers into a void *.

    4.14 How are integers converted to and from pointers? Can I temporarily stuff an integer into a pointer, or vice versa?

    4.15 How do I convert an int to a char *? I tried a cast, but it's not working.

    4.16 What's wrong with this declaration?

    char* p1, p2;

    I get errors when I try to use p2.

    4.17 What are ``near'' and ``far'' pointers?

  2. #2
    Ngày gia nhập
    01 2007
    Bài viết
    412

    5. Null Pointers

    5.1 What is this infamous null pointer, anyway?

    5.2 How do I get a null pointer in my programs?

    5.3 Is the abbreviated pointer comparison ``if(p)'' to test for non-null pointers valid? What if the internal representation for null pointers is nonzero?

    5.4 What is NULL and how is it defined?

    5.5 How should NULL be defined on a machine which uses a nonzero bit pattern as the internal representation of a null pointer?

    5.6 If NULL were defined as follows:

    #define NULL ((char *)0)

    wouldn't that make function calls which pass an uncast NULL work?

    5.7 My vendor provides header files that #define NULL as 0L. Why?

    5.8 Is NULL valid for pointers to functions?

    5.9 If NULL and 0 are equivalent as null pointer constants, which should I use?

    5.10 But wouldn't it be better to use NULL (rather than 0), in case the value of NULL changes, perhaps on a machine with nonzero internal null pointers?

    5.11 I once used a compiler that wouldn't work unless NULL was used.

    5.12 I use the preprocessor macro

    #define Nullptr(type) (type *)0

    to help me build null pointers of the correct type.

    5.13 This is strange. NULL is guaranteed to be 0, but the null pointer is not?

    5.14 Why is there so much confusion surrounding null pointers? Why do these questions come up so often?

    5.15 I'm confused. I just can't understand all this null pointer stuff.

    5.16 Given all the confusion surrounding null pointers, wouldn't it be easier simply to require them to be represented internally by zeroes?

    5.17 Seriously, have any actual machines really used nonzero null pointers, or different representations for pointers to different types?

    5.18 Is a run-time integral value of 0, cast to a pointer, guaranteed to be a null pointer?

    5.19 How can I access an interrupt vector located at the machine's location 0? If I set a pointer to 0, the compiler might translate it to some nonzero internal null pointer value.

    5.20 What does a run-time ``null pointer assignment'' error mean? How can I track it down?
    6. Arrays and Pointers

    6.1 I had the definition char a[6] in one source file, and in another I declared extern char *a. Why didn't it work?

    6.2 But I heard that char a[] was identical to char *a.

    6.3 So what is meant by the ``equivalence of pointers and arrays'' in C?

    6.4 If they're so different, then why are array and pointer declarations interchangeable as function formal parameters?

    6.4b So arrays are passed by reference, even though the rest of C uses pass by value?

    6.5 Why can't I do something like this?

    extern char *getpass();
    char str[10];
    str = getpass("Enter password: ");

    6.6 If you can't assign to arrays, then how can

    int f(char str[])
    {
    if(str[0] == '\0')
    str = "none";
    ...
    }

    work?

    6.6b And what about this? Isn't this an array assignment?

    char a[] = "Hello, world!\n";

    6.7 How can an array be an lvalue, if you can't assign to it?

    6.8 Practically speaking, what is the difference between arrays and pointers?

    6.9 Someone explained to me that arrays were really just constant pointers.

    6.10 I'm still mystified. Is a pointer a kind of array, or is an array a kind of pointer?

    6.11 I came across some ``joke'' code containing the ``expression'' 5["abcdef"] . How can this be legal C?

    6.12 Since array references decay into pointers, if arr is an array, what's the difference between arr and &arr?

    6.13 How do I declare a pointer to an array?

    6.14 How can I set an array's size at run time?
    How can I avoid fixed-sized arrays?

    6.15 How can I declare local arrays of a size matching a passed-in array?

    6.16 How can I dynamically allocate a multidimensional array?

    6.17 Here's a neat trick: if I write

    int realarray[10];
    int *array = &realarray[-1];

    I can treat array as if it were a 1-based array.

    6.18 My compiler complained when I passed a two-dimensional array to a function expecting a pointer to a pointer.

    6.19 How do I write functions which accept two-dimensional arrays when the width is not known at compile time?

    6.20 How can I use statically- and dynamically-allocated multidimensional arrays interchangeably when passing them to functions?

    6.21 Why doesn't sizeof properly report the size of an array when the array is a parameter to a function? I have a test routine

    f(char a[10])
    {
    int i = sizeof(a);
    printf("%d\n", i);
    }

    and it prints 4, not 10.

    6.22 How can code in a file where an array is declared as extern (i.e. it is defined, and its size determined, in some other file) determine the size of the array? sizeof doesn't seem to work.

    6.23 I want to know how many elements are in an array, but sizeof yields the size in bytes.

    6.24 Is there a way to have an array of bits?
    7. Memory Allocation

    7.1 Why doesn't this fragment work?

    char *answer;
    printf("Type something:\n");
    gets(answer);
    printf("You typed \"%s\"\n", answer);

    7.2 I can't get strcat to work. I tried

    char *s1 = "Hello, ";
    char *s2 = "world!";
    char *s3 = strcat(s1, s2);

    but I got strange results.

    7.3 But the man page for strcat says that it takes two char *'s as arguments. How am I supposed to know to allocate things?

    7.3b I just tried the code

    char *p;
    strcpy(p, "abc");

    and it worked. How? Why didn't it crash?

    7.3c How much memory does a pointer variable allocate?

    7.4 I'm reading lines from a file into an array, with this code:

    char linebuf[80];
    char *lines[100];
    int i;

    for(i = 0; i < 100; i++) {
    char *p = fgets(linebuf, 80, fp);
    if(p == NULL) break;
    lines[i] = p;
    }

    Why do all the lines end up containing copies of the last line?

    7.5a I have a function that is supposed to return a string, but when it returns to its caller, the returned string is garbage.

    7.5b So what's the right way to return a string or other aggregate?

    7.6 Why am I getting ``warning: assignment of pointer from integer lacks a cast'' for calls to malloc?

    7.7 Why does some code carefully cast the values returned by malloc to the pointer type being allocated?

    7.7b What's wrong with casting malloc's return value?

    7.7c In a call to malloc, what does an error like ``Cannot convert `void *' to `int *''' mean?

    7.8 I see code like

    char *p = malloc(strlen(s) + 1);
    strcpy(p, s);

    Shouldn't that be malloc((strlen(s) + 1) * sizeof(char))?

    7.9 I wrote a little wrapper around malloc, but it doesn't work:

    #include <stdio.h>
    #include <stdlib.h>

    mymalloc(void *retp, size_t size)
    {
    retp = malloc(size);
    if(retp == NULL) {
    fprintf(stderr, "out of memory\n");
    exit(EXIT_FAILURE);
    }
    }

    7.10 I'm trying to declare a pointer and allocate some space for it, but it's not working. What's wrong with this code?

    char *p;
    *p = malloc(10);

    7.10a What's wrong with this initialization?

    char *p = malloc(10);

    My compiler is complaining about an ``invalid initializer'', or something.

    7.10b How can I shut off the ``warning: possible pointer alignment problem'' message which lint gives me for each call to malloc?

    7.11 How can I dynamically allocate arrays?

    7.12 How can I find out how much memory is available?

    7.13 What should malloc(0) do? Return a null pointer or a pointer to 0 bytes?

    7.14 I've heard that some operating systems don't actually allocate malloc'ed memory until the program tries to use it. Is this legal?

    7.15 malloc is returning crazy pointer values, but I did read question 7.6 and I have included the line

    extern void *malloc();

    before I call it.

    7.16 I'm allocating a large array for some numeric work, using the line

    double *array = malloc(300 * 300 * sizeof(double));

    malloc isn't returning null, but the program is acting strangely, as if it's overwriting memory, or malloc isn't allocating as much as I asked for, or something.

    7.17 I've got 8 meg of memory in my PC. Why can I only seem to malloc 640K or so?

    7.18 My application depends heavily on dynamic allocation of nodes for data structures, and malloc/free overhead is becoming a bottleneck. What can I do?

    7.19 My program is crashing, apparently somewhere down inside malloc, but I can't see anything wrong with it. Is there a bug in malloc?

    7.19b

    I'm dynamically allocating an array, like this:

    int *iarray = (int *)malloc(nints);

    malloc isn't returning NULL, but the code isn't working.

    7.20 You can't use dynamically-allocated memory after you free it, can you?

    7.21 Why isn't a pointer null after calling free?
    How unsafe is it to use (assign, compare) a pointer value after it's been freed?

    7.22 When I call malloc to allocate memory for a pointer which is local to a function, do I have to explicitly free it?

    7.23 I'm allocating structures which contain pointers to other dynamically-allocated objects. When I free a structure, do I also have to free each subsidiary pointer?

    7.24 Must I free allocated memory before the program exits?

    7.25 I have a program which mallocs and later frees a lot of memory, but I can see from the operating system that memory usage doesn't actually go back down.

    7.26 How does free know how many bytes to free?

    7.27 So can I query the malloc package to find out how big an allocated block is?

    7.28 Why doesn't sizeof tell me the size of the block of memory pointed to by a pointer?

    7.29 Having dynamically allocated an array (as in question 6.14), can I change its size?

    7.30 Is it legal to pass a null pointer as the first argument to realloc? Why would you want to?

    7.31 What's the difference between calloc and malloc? Which should I use? Is it safe to take advantage of calloc's zero-filling? Does free work on memory allocated with calloc, or do you need a cfree?

    7.32 What is alloca and why is its use discouraged?
    8. Characters and Strings

    8.1 Why doesn't

    strcat(string, '!');

    work?

    8.2 I'm checking a string to see if it matches a particular value. Why isn't this code working?

    char *string;
    ...
    if(string == "value") {
    /* string matches "value" */
    ...
    }

    8.3 If I can say

    char a[] = "Hello, world!";

    why can't I say

    char a[14];
    a = "Hello, world!";

    8.4 I can't get strcat to work. I tried

    char *s1 = "Hello, ";
    char *s2 = "world!";
    char *s3 = strcat(s1, s2);

    but I got strange results.

    8.5 What is the difference between these initializations?

    char a[] = "string literal";
    char *p = "string literal";

    My program crashes if I try to assign a new value to p[i].

    8.6 How can I get the numeric value (i.e. ASCII or other character set code) corresponding to a character, or vice versa?

    8.7 Does C have anything like the ``substr'' (extract substring) routine present in other languages?

    8.8 I'm reading strings typed by the user into an array, and then printing them out later. When the user types a sequence like \n, why isn't it being handled properly?

    8.9 I think something's wrong with my compiler: I just noticed that sizeof('a') is 2, not 1 (i.e. not sizeof(char)).

    8.10 I'm starting to think about multinational character sets, and I'm worried about the implications of making sizeof(char) be 2 so that 16-bit character sets can be represented.

  3. #3
    Ngày gia nhập
    01 2007
    Bài viết
    412

    9. Boolean Expressions and Variables

    9.1 What is the right type to use for Boolean values in C? Is there a standard type? Should I use #defines or enums for the true and false values?

    9.2 Isn't #defining TRUE to be 1 dangerous, since any nonzero value is considered ``true'' in C? What if a built-in logical or relational operator ``returns'' something other than 1?

    9.3 Is if(p), where p is a pointer, a valid and portable test?

    9.4 Should I use symbolic names like TRUE and FALSE for Boolean constants, or plain 1 and 0?

    9.5 A third-party header file I just started using is defining its own TRUE and FALSE values incompatibly with the code I've already developed. What can I do?
    10. C Preprocessor

    10.1 I'm trying to define a few simple little function-like macros such as

    #define square(x) x * x

    but they're not always working.

    10.2 Here are some cute preprocessor macros:

    #define begin {
    #define end }

    With these, I can write C code that looks more like Pascal. What do y'all think?

    10.3 How can I write a generic macro to swap two values?

    10.4 What's the best way to write a multi-statement macro?

    10.5 What's the difference between using a typedef or a #define for a user-defined type?

    10.5b What's the difference between

    const MAXSIZE = 100;

    and

    #define MAXSIZE 100

    10.6 I'm splitting up a program into multiple source files for the first time, and I'm wondering what to put in .c files and what to put in .h files. (What does ``.h'' mean, anyway?)

    10.7 Is it acceptable for one header file to #include another?

    10.8a What's the difference between #include <> and #include "" ?

    10.8b What are the complete rules for header file searching?

    10.9 I'm getting strange syntax errors on the very first declaration in a file, but it looks fine.

    10.10 I'm using header files which accompany two different third-party libraries, and they are ``helpfully'' defining common macros such as TRUE, FALSE, Min(), and Max(), but the definitions clash with each other and with definitions I'd already established in my own header files. What can I do?

    10.10b I'm #including the right header file for the library function I'm using, but the linker keeps saying it's undefined.

    10.11 I'm compiling a program, and I seem to be missing one of the header files it requires. Can someone send me a copy?

    10.12 How can I construct preprocessor #if expressions which compare strings?

    10.13 Does the sizeof operator work in preprocessor #if directives?

    10.14 Can I use an #ifdef in a #define line, to define something two different ways, like this?

    #define a b \
    #ifdef whatever
    c d
    #else
    e f g
    #endif

    10.15 Is there anything like an #ifdef for typedefs?

    10.16 How can I use a preprocessor #if expression to tell whether a machine's byte order is big-endian or little-endian?

    10.17 I'm getting strange syntax errors inside lines I've #ifdeffed out.

    10.18 I inherited some code which contains far too many #ifdef's for my taste. How can I preprocess the code to leave only one conditional compilation set, without running it through the preprocessor and expanding all of the #include's and #define's as well?

    10.19 How can I list all of the predefined identifiers?

    10.20 I have some old code that tries to construct identifiers with a macro like

    #define Paste(a, b) a/**/b

    but it doesn't work any more.

    10.21 I have an old macro

    #define CTRL(c) ('c' & 037)

    that doesn't seem to work any more.

    10.22 Why is the macro

    #define TRACE(n) printf("TRACE: %d\n", n)

    giving me the warning ``macro replacement within a string literal''? It seems to be expanding

    TRACE(count);

    as

    printf("TRACE: %d\count", count);

    10.23 How can I use a macro argument inside a string literal in the macro expansion?

    10.24 I'm trying to use the ANSI ``stringizing'' preprocessing operator `#' to insert the value of a symbolic constant into a message, but it keeps stringizing the macro's name rather than its value.

    10.25 I've got this tricky preprocessing I want to do and I can't figure out a way to do it.

    10.26 How can I write a macro which takes a variable number of arguments, or use the preprocessor to ``turn off'' a function call with a variable number of arguments?

    10.27 How can I include expansions of the __FILE__ and __LINE__ macros in a general-purpose debugging macro?
    11. ANSI/ISO Standard C

    11.1 What is the ``ANSI C Standard?''

    11.2 How can I get a copy of the Standard?

    11.2b Where can I get information about updates to the Standard?

    11.3 My ANSI compiler complains about a mismatch when it sees

    extern int func(float);

    int func(x)
    float x;
    { ...

    11.4 Can you mix old-style and new-style function syntax?

    11.5 Why does the declaration

    extern int f(struct x *p);

    give me an obscure warning message about ``struct x declared inside parameter list''?

    11.6 I had a frustrating problem which turned out to be caused by the line

    printf("%d", n);

    where n was actually a long int. I thought that ANSI function prototypes were supposed to guard against argument type mismatches like this.

    11.7 I heard that you have to #include <stdio.h> before calling printf. Why?

    11.8 I don't understand why I can't use const values in initializers and array dimensions, as in

    const int n = 5;
    int a[n];

    11.8b If you can't modify string literals, why aren't they defined as being arrays of const characters?

    11.9 What's the difference between const char *p, char const *p, and char * const p?

    11.10 Why can't I pass a char ** to a function which expects a const char **?

    11.11 I've got the declarations

    typedef char *charp;
    const charp p;

    Why is p turning out const, instead of the characters pointed to?

    11.11b What's the difference between

    const MAXSIZE = 100;

    and

    #define MAXSIZE 100

    11.12a What's the correct declaration of main()?

    11.12b Can I declare main as void, to shut off these annoying ``main returns no value'' messages?

    11.13 But what about main's third argument, envp?

    11.14a I believe that declaring void main() can't fail, since I'm calling exit instead of returning, and anyway my operating system ignores a program's exit/return status.

    11.14b So what could go wrong? Are there really any systems where void main() doesn't work?

    11.15 The book I've been using, C Programing for the Compleat Idiot, always uses void main().

    11.16 Is exit(status) truly equivalent to returning the same status from main?

    11.17 I'm trying to use the ANSI ``stringizing'' preprocessing operator `#' to insert the value of a symbolic constant into a message, but it keeps stringizing the macro's name rather than its value.

    11.18 What does the message ``warning: macro replacement within a string literal'' mean?

    11.19 I'm getting strange syntax errors inside lines I've #ifdeffed out.

    11.20 What are #pragmas and what are they good for?

    11.21 What does ``#pragma once'' mean? I found it in some header files.

    11.22 Is char a[3] = "abc"; legal? What does it mean?

    11.23 Since array references decay into pointers, if arr is an array, what's the difference between arr and &arr?

    11.24 Why can't I perform arithmetic on a void * pointer?

    11.25 What's the difference between memcpy and memmove?

    11.26 What should malloc(0) do? Return a null pointer or a pointer to 0 bytes?

    11.27 Why does the ANSI Standard place limits on the length and case-significance of external identifiers?

    11.28 What was noalias and what ever happened to it?

    11.29a My compiler is rejecting the simplest possible test programs, with all kinds of syntax errors. It's complaining about the first line of

    main(int argc, char **argv)
    {
    return 0;
    }

    11.29b What does the message ``Automatic aggregate intialization is an ANSI feature'' mean? My compiler is complaining about valid ANSI code.

    11.30 Why are some ANSI/ISO Standard library functions showing up as undefined, even though I've got an ANSI compiler?

    11.31 Does anyone have a tool for converting old-style C programs to ANSI C, or vice versa, or for automatically generating prototypes?

    11.32 Why won't the Frobozz Magic C Compiler, which claims to be ANSI compliant, accept this code? I know that the code is ANSI, because gcc accepts it.

    11.33 People seem to make a point of distinguishing between implementation-defined, unspecified, and undefined behavior. What do these mean?

    11.33b What does it really mean for a program to be ``legal'' or ``valid'' or ``conforming''?

    11.34 I'm appalled that the ANSI Standard leaves so many issues undefined. Isn't a Standard's whole job to standardize these things?

    11.35 People keep saying that the behavior of i = i++ is undefined, but I just tried it on an ANSI-conforming compiler, and got the results I expected.
    12. Stdio

    12.1 What's wrong with this code?

    char c;
    while((c = getchar()) != EOF) ...

    12.1b I have a simple little program that reads characters until EOF, but how do I actually enter that ``EOF'' value from the keyboard? I see that EOF is defined by <stdio.h> to be -1; am I supposed to enter -1?

    12.2 Why does the simple line-copying loop while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); } copy the last line twice?

    12.3 I'm using fgets to read lines from a file into an array of pointers. Why do all the lines end up containing copies of the last line?

    12.4 My program's prompts and intermediate output don't always show up on the screen, especially when I pipe the output through another program.

    12.5 How can I read one character at a time, without waiting for the RETURN key?

    12.6 How can I print a '%' character in a printf format string? I tried \%, but it didn't work.

    12.7 Why doesn't

    long int n = 123456;
    printf("%d\n", n);

    work?

    12.8 I thought that ANSI function prototypes were supposed to guard against argument type mismatches.

    12.9 Someone told me it was wrong to use %lf with printf. How can printf use %f for type double, if scanf requires %lf?

    12.9b What printf format should I use for a typedef like size_t when I don't know whether it's long or some other type?

    12.10 How can I implement a variable field width with printf? That is, instead of something like %8d, I want the width to be specified at run time.

    12.11 How can I print numbers with commas separating the thousands?
    What about currency formatted numbers?

    12.12 Why doesn't the call scanf("%d", i) work?

    12.12b Why does the call

    char s[30];
    scanf("%s", s);

    work? I thought you always needed an & on each variable passed to scanf.

    12.13 Why doesn't this code:

    double d;
    scanf("%f", &d);

    work?

    12.14 Why doesn't the code

    short int s;
    scanf("%d", &s);

    work?

    12.15 How can I specify a variable width in a scanf format string?

    12.16 How can I read data from data files with particular formats?
    How can I read ten floats without having to use a jawbreaker scanf format
    like "%f %f %f %f %f %f %f %f %f %f"?
    How can I read an arbitrary number of fields from a line into an array?

    12.17 When I read numbers from the keyboard with scanf and a "%d\n" format, like this:

    int n;
    scanf("%d\n", &n);
    printf("you typed %d\n", n);

    it seems to hang until I type one extra line of input.

    12.18a I'm reading a number with scanf and %d, and then a string with gets():

    int n;
    char str[80];

    printf("enter a number: ");
    scanf("%d", &n);
    printf("enter a string: ");
    gets(str);
    printf("you typed %d and \"%s\"\n", n, str);

    but the compiler seems to be skipping the call to gets()!

    12.18b I'm using scanf %c to read a Y/N response, but later input gets skipped.

    12.19 I figured I could use scanf more safely if I checked its return value to make sure that the user typed the numeric values I expect:

    int n;

    while(1) {
    printf("enter a number: ");
    if(scanf("%d", &n) == 1)
    break;
    printf("try again: ");
    }

    printf("you typed %d\n", n);

    but sometimes it seems to go into an infinite loop. [footnote] Why?

    12.20 Why does everyone say not to use scanf? What should I use instead?

    12.21 How can I tell how much destination buffer space I'll need for an arbitrary sprintf call? How can I avoid overflowing the destination buffer with sprintf?

    12.22 What's the deal on sprintf's return value? Is it an int or a char *?

    12.23 Why does everyone say not to use gets()?

    12.24 I thought I'd check errno after a long string of printf calls, to see if any of them had failed:

    errno = 0;
    printf("This\n");
    printf("is\n");
    printf("a\n");
    printf("test.\n");
    if(errno != 0)
    fprintf(stderr, "printf failed: %s\n", strerror(errno));

    Why is it printing something strange like ``printf failed: Not a typewriter'' when I redirect the output to a file?

    12.25 What's the difference between fgetpos/fsetpos and ftell/fseek?
    What are fgetpos and fsetpos good for?

    12.26a How can I flush pending input so that a user's typeahead isn't read at the next prompt? Will fflush(stdin) work?

    12.26b If fflush won't work, what can I use to flush input?

    12.27 I wrote this routine which is supposed to open a file:

    myfopen(char *filename, FILE *fp)
    {
    fp = fopen(filename, "r");
    }

    But when I call it like this:

    FILE *infp;
    myfopen("filename.dat", infp);

    the infp variable in the caller doesn't get set properly.

    12.28 I can't even get a simple fopen call to work! What's wrong with this call?

    FILE *fp = fopen(filename, 'r');

    12.28b How can I open files with names like ``file1'', ``file2'', ``file3'', etc., where the numeric part is controlled by a variable? Basically I want ``file%d'', like printf.

    12.29 fopen is failing for certain pathnames.

    12.30 I'm trying to update a file in place, by using fopen mode "r+", reading a certain string, and writing back a modified string, but it's not working.

    12.31 How can I insert or delete a line (or record) in the middle of a file?

    12.32 How can I recover the file name given an open stream?

    12.33 How can I redirect stdin or stdout to a file from within a program?

    12.34 Once I've used freopen, how can I get the original stdout (or stdin) back?

    12.35 How can I tell if standard input or output is redirected (i.e. whether ``<'' or ``>'' was used on the invocation command line)?

    12.36 I'm trying to write a program like ``more.'' How can I get back to the interactive keyboard if stdin is redirected?

    12.36b How can I arrange to have output go two places at once, e.g. to the screen and to a file?

    12.37 I want to read and write numbers between files and memory in a byte-at-a-time way, not as formatted characters the way fprintf and fscanf do. How can I do this?

    12.38 How can I read a binary data file properly? I'm occasionally seeing 0x0a and 0x0d values getting garbled, and I seem to hit EOF prematurely if the data contains the value 0x1a.

    12.39 I'm writing a ``filter'' for binary files, but stdin and stdout are preopened as text streams. How can I change their mode to binary?

    12.40 What's the difference between text and binary I/O?

    12.41 How can I read/write structures from/to data files?

    12.42 How can I write code to conform to these old, binary data file formats?

    12.43 I'm reading strings typed by the user into an array, and then printing them out later. When the user types a sequence like \n, why isn't it being handled properly?
    13. Library Functions

    13.1 How can I convert numbers to strings (the opposite of atoi)? Is there an itoa function?

    13.2 Why does strncpy not always place a '\0' terminator in the destination string?

    13.3 Does C have anything like the ``substr'' (extract substring) routine present in other languages?

    13.4 How do I convert a string to all upper or lower case?

    13.5 Why do some versions of toupper act strangely if given an upper-case letter?
    Why does some code call islower before toupper?

    13.6 How can I split up a string into whitespace-separated fields?
    How can I duplicate the process by which main() is handed argc and argv?

    13.7 I need some code to do regular expression and wildcard matching.

    13.8 I'm trying to sort an array of strings with qsort, using strcmp as the comparison function, but it's not working.

    13.9 Now I'm trying to sort an array of structures with qsort. My comparison function takes pointers to structures, but the compiler complains that the function is of the wrong type for qsort. How can I cast the function pointer to shut off the warning?

    13.10 How can I sort a linked list?

    13.11 How can I sort more data than will fit in memory?

    13.12 How can I get the current date or time of day in a C program?

    13.13 I know that the library function localtime will convert a time_t into a broken-down struct tm, and that ctime will convert a time_t to a printable string. How can I perform the inverse operations of converting a struct tm or a string into a time_t?

    13.14 How can I add N days to a date? How can I find the difference between two dates?

    13.14b Did C have any Year 2000 problems?

    13.15 I need a random number generator.

    13.16 How can I get random integers in a certain range?

    13.17 Each time I run my program, I get the same sequence of numbers back from rand().

    13.18 I need a random true/false value, so I'm just taking rand() % 2, but it's alternating 0, 1, 0, 1, 0...

    13.19 How can I return a sequence of random numbers which don't repeat at all?

    13.19b How can I generate floating-point random numbers?

    13.20 How can I generate random numbers with a normal or Gaussian distribution?

    13.21 I'm porting this program, and it calls a routine drand48, which my library doesn't have. What is it?

    13.22 Is exit(status) truly equivalent to returning the same status from main?

    13.23 What's the difference between memcpy and memmove?

    13.24 I'm trying to port this old program. Why do I get ``undefined external'' errors for some library functions?

    13.25 I keep getting errors due to library functions being undefined, but I'm #including all the right header files.

    13.26 I'm still getting errors due to library functions being undefined, even though I'm explicitly requesting the right libraries while linking.

    13.27 Why is my simple program, which hardly does more than print ``Hello, world!'' in a window, compiling to such a huge executable (several hundred K)? Should I #include fewer header files?

    13.28 What does it mean when the linker says that _end is undefined?

    13.29 My compiler is complaining that printf is undefined! How can this be? It's the world's most popular C function...
    14. Floating Point

    14.1 When I set a float variable to, say, 3.1, why is printf printing it as 3.0999999?

    14.2 I'm trying to take some square roots, and I've simplified the code down to

    main()
    {
    printf("%f\n", sqrt(144.));
    }

    but I'm still getting crazy numbers.

    14.3 I'm trying to do some simple trig, and I am #including <math.h>, but the linker keeps complaining that functions like sin and cos are undefined.

    14.4a My floating-point calculations are acting strangely and giving me different answers on different machines.

    14.4b I'm sure I've got the trig functions declared correctly, but they're still giving me wrong answers.

    14.5 What's a good way to check for ``close enough'' floating-point equality?

    14.6 How do I round numbers?

    14.7 Why doesn't C have an exponentiation operator?

    14.8 The predefined constant M_PI seems to be missing from my machine's copy of <math.h>.

    14.9 How do I set variables to, or test for IEEE NaN (``Not a Number'') and other special values?

    14.10 How can I handle floating-point exceptions gracefully?

    14.11 What's a good way to implement complex numbers in C?

    14.12 I'm looking for some code to do:

    Fast Fourier Transforms (FFT's)
    matrix arithmetic (multiplication, inversion, etc.)
    complex arithmetic

    14.13 I'm having trouble with a Turbo C program which crashes and says something like ``floating point formats not linked.''

  4. #4
    Ngày gia nhập
    01 2007
    Bài viết
    412

    15. Variable-Length Argument Lists

    15.1 I heard that you have to #include <stdio.h> before calling printf. Why?

    15.2 How can %f be used for both float and double arguments in printf? Aren't they different types?

    15.3 I had a frustrating problem which turned out to be caused by the line

    printf("%d", n);

    where n was actually a long int. I thought that ANSI function prototypes were supposed to guard against argument type mismatches like this.

    15.4 How can I write a function that takes a variable number of arguments?

    15.5 How can I write a function that takes a format string and a variable number of arguments, like printf, and passes them to printf to do most of the work?

    15.6 How can I write a function analogous to scanf, i.e. that accepts similar arguments, and calls scanf to do most of the work?

    15.7 I have a pre-ANSI compiler, without <stdarg.h>. What can I do?

    15.8 How can I discover how many arguments a function was actually called with?

    15.9 My compiler isn't letting me declare a function

    int f(...)
    {
    }

    i.e. accepting a variable number of arguments, but with no fixed arguments at all.

    15.10 I have a varargs function which accepts a float parameter. Why isn't

    va_arg(argp, float)

    working?

    15.11 I can't get va_arg to pull in an argument of type pointer-to-function.

    15.12 How can I write a function which takes a variable number of arguments and passes them to some other function (which takes a variable number of arguments)?

    15.13 How can I call a function with an argument list built up at run time?
    16. Strange Problems

    16.1 Why is this loop always executing once?

    for(i = start; i < end; i++);
    {
    printf("%d\n", i);
    }

    16.1b I'm getting baffling syntax errors which make no sense at all, and it seems like large chunks of my program aren't being compiled.

    16.1c Why isn't my procedure call working? The compiler seems to skip right over it.

    16.2 I'm getting strange syntax errors on the very first declaration in a file, but it looks fine.

    16.3 This program crashes before it even runs! (When single-stepping with a debugger, it dies before the first statement in main.)

    16.4 I have a program that seems to run correctly, but it crashes as it's exiting, after the last statement in main(). What could be causing this?

    16.5 This program runs perfectly on one machine, but I get weird results on another. Stranger still, adding or removing a debugging printout changes the symptoms...

    16.6 Why does this code:

    char *p = "hello, world!";
    p[0] = 'H';

    crash?

    16.7

    I've got some code that's trying to unpack external structures, but it's crashing with a message about an ``unaligned access.'' What does this mean? The code looks like this:

    struct mystruct {
    char c;
    long int i32;
    int i16;
    } s;

    char buf[7], *p;
    fread(buf, 7, 1, fp);
    p = buf;
    s.c = *p++;
    s.i32 = *(long int *)p;
    p += 4;
    s.i16 = *(int *)p;

    16.8 What do ``Segmentation violation'', ``Bus error'', and ``General protection fault'' mean? What's a ``core dump''?
    17. Style

    17.1 What's the best style for code layout in C?

    17.2 How should functions be apportioned among source files?

    17.3 Here's a neat trick for checking whether two strings are equal:

    if(!strcmp(s1, s2))

    Is this good style?

    17.4 Why do some people write if(0 == x) instead of if(x == 0)?

    17.4b I've seen function declarations that look like this:

    extern int func __((int, int));

    What are those extra parentheses and underscores for?

    17.5 I came across some code that puts a (void) cast before each call to printf. Why?

    17.6 If NULL and 0 are equivalent as null pointer constants, which should I use?

    17.7 Should I use symbolic names like TRUE and FALSE for Boolean constants, or plain 1 and 0?

    17.8 What is ``Hungarian Notation''? Is it worthwhile?

    17.9 Where can I get the ``Indian Hill Style Guide'' and other coding standards?

    17.10 Some people say that goto's are evil and that I should never use them. Isn't that a bit extreme?

    17.11 People always say that good style is important, but when they go out of their way to use clear techniques and make their programs readable, they seem to end up with less efficient programs. Since efficiency is so important, isn't it necessary to sacrifice some style and readability?

    17.12 Which is correct,

    char *p

    or

    char* p

    ?
    18. Tools and Resources

    18.1 I need some C development tools.

    18.2 How can I track down these pesky malloc problems?

    18.3 What's a free or cheap C compiler I can use?

    18.4 I just typed in this program, and it's acting strangely. Can you see anything wrong with it?

    18.5 How can I shut off the ``warning: possible pointer alignment problem'' message which lint gives me for each call to malloc?

    18.6 Can I declare main as void, to shut off these annoying ``main returns no value'' messages?

    18.7 Where can I get an ANSI-compatible lint?

    18.8 Don't ANSI function prototypes render lint obsolete?

    18.9 Are there any C tutorials or other resources on the net?

    18.9b Where can I find some good code examples to study and learn from?

    18.10 What's a good book for learning C? What about advanced books and references?

    18.11 Where can I find answers to the exercises in K&R?

    18.12 Does anyone know where the source code from books like Numerical Recipes in C, Plauger's The Standard C Library, or Kernighan and Pike's The UNIX Programming Environment is available on-line?

    18.13 Where can I find the sources of the standard C libraries?

    18.13b Is there an on-line C reference manual?

    18.13c Where can I get a copy of the ANSI/ISO C Standard?

    18.14 I need code to parse and evaluate expressions.

    18.15 Where can I get a BNF or YACC grammar for C?

    18.15b Does anyone have a C compiler test suite I can use?

    18.15c Where are some collections of useful code fragments and examples?

    18.15d I need code for performing multiple precision arithmetic.

    18.16 Where and how can I get copies of all these freely distributable programs?

    18.17 Where can I get extra copies of this list?
    19. System Dependencies

    19.1 How can I read a single character from the keyboard without waiting for the RETURN key? How can I stop characters from being echoed on the screen as they're typed?

    19.2 How can I find out if there are characters available for reading (and if so, how many)? Alternatively, how can I do a read that will not block if there are no characters available?

    19.3 How can I display a percentage-done indication that updates itself in place, or show one of those ``twirling baton'' progress indicators?

    19.4 How can I clear the screen?
    How can I print text in color?
    How can I move the cursor to a specific x, y position?

    19.4b I'm compiling some test programs on a windows-based system, and the windows containing my program's output are closing so quickly after my program calls exit that I can't see the output. How can I make it pause before closing?

    19.5 How do I read the arrow keys? What about function keys?

    19.6 How do I read the mouse?

    19.7 How can I do serial (``comm'') port I/O?

    19.8 How can I direct output to the printer?

    19.9 How do I send escape sequences to control a terminal or other device?

    19.9b How can I access an I/O board directly?

    19.10 How can I do graphics?

    19.10b How can I display GIF and JPEG images?

    19.10c How can I load new fonts for display?

    19.10d How can I send mail from within a C program?

    19.11 How can I check whether a file exists? I want to warn the user if a requested input file is missing.

    19.12 How can I find out the size of a file, prior to reading it in?

    19.12b How can I find the modification date and time of a file?

    19.13 How can a file be shortened in-place without completely clearing or rewriting it?

    19.14 How can I insert or delete a line (or record) in the middle of a file?

    19.15 How can I recover the file name given an open stream or file descriptor?

    19.16 How can I delete a file?

    19.16b How do I copy files?

    19.17 Why can't I open a file by its explicit path? The call

    fopen("c:\newdir\file.dat", "r")

    is failing.

    19.17b fopen isn't letting me open files like "$HOME/.profile" and "~/.myrcfile".

    19.17c How can I suppress the dreaded MS-DOS ``Abort, Retry, Ignore?'' message?

    19.18 I'm getting an error, ``Too many open files''. How can I increase the allowable number of simultaneously open files?

    19.19 How can I find out how much free space is available on disk?

    19.20 How can I read a directory in a C program?

    19.21 How do I create a directory?
    How do I remove a directory (and its contents)?

    19.22 How can I find out how much memory is available?

    19.23 How can I allocate arrays or structures bigger than 64K?

    19.24 What does the error message ``DGROUP data allocation exceeds 64K'' mean, and what can I do about it? I thought that using large model meant that I could use more than 64K of data!

    19.25 How can I access memory (a memory-mapped device, or graphics memory) located at a certain address?
    How can I do PEEK and POKE in C?

    19.25b How can I determine whether a machine's byte order is big-endian or little-endian?

    19.26 How can I access an interrupt vector located at the machine's location 0? If I set a pointer to 0, the compiler might translate it to some nonzero internal null pointer value.

    19.27 How can I invoke another program (a standalone executable, or an operating system command) from within a C program?

    19.28 How can I call system when parameters (filenames, etc.) of the executed command aren't known until run time?

    19.29 How do I get an accurate error status return from system on MS-DOS?

    19.30 How can I invoke another program or command and trap its output?

    19.31 How can my program discover the complete pathname to the executable from which it was invoked?

    19.32 How can I automatically locate a program's configuration files in the same directory as the executable?

    19.33 How can a process change an environment variable in its caller?

    19.34 How can I open files mentioned on the command line, and parse option flags?

    19.35 Is exit(status) truly equivalent to returning the same status from main?

    19.36 How can I read in an object file and jump to locations in it?

    19.37 How can I implement a delay, or time a user's response, with sub-second resolution?

    19.38 How can I trap or ignore keyboard interrupts like control-C?

    19.39 How can I handle floating-point exceptions gracefully?

    19.39b How can I ensure that integer arithmetic doesn't overflow?

    19.40 How do I... Use sockets? Do networking? Write client/server applications?

    19.40a Can I combine .OBJ and .LIB files from Microsoft C and Turbo C?

    19.40b How do I... Use BIOS calls? Write ISR's? Create TSR's?

    19.40c I'm trying to compile this program, but the compiler is complaining that ``union REGS'' is undefined, and the linker is complaining that int86 is undefined.

    19.40d What are ``near'' and ``far'' pointers?

    19.41 But I can't use all these nonstandard, system-dependent functions, because my program has to be ANSI compatible!

    19.42 Why isn't any of this standardized in C? Any real program has to do some of these things.
    20. Miscellaneous

    20.1 How can I return multiple values from a function?

    20.2 What's a good data structure to use for storing lines of text? I started to use fixed-size arrays of arrays of char, but they're just too restrictive.

    20.3 How can I open files mentioned on the command line, and parse option flags?

    20.4 What's the right way to use errno?

    20.5 How can I write data files which can be read on other machines with different word size, byte order, or floating point formats?

    20.6 If I have a char * variable pointing to the name of a function, how can I call that function? Code like

    extern int func(int, int);
    char *funcname = "func";
    int r = (*funcname)(1, 2);

    or

    r = (*(int (*)(int, int))funcname)(1, 2);

    doesn't seem to work.

    20.6b How can I ensure that integer arithmetic doesn't overflow?

    20.7 How can I manipulate individual bits?

    20.8 How can I implement sets or arrays of bits?

    20.9 How can I determine whether a machine's byte order is big-endian or little-endian?

    20.9b How do I swap bytes?

    20.10 How can I convert integers to binary or hexadecimal?

    20.11 Can I use base-2 constants (something like 0b101010)?
    Is there a printf format for binary?

    20.12 What is the most efficient way to count the number of bits which are set in an integer?

    20.13 What's the best way of making my program efficient?

    20.14 Are pointers really faster than arrays? How much do function calls slow things down? Is ++i faster than i = i + 1?

    20.15 I've been replacing multiplications and divisions with shift operators, because shifting is more efficient.

    20.15b People claim that optimizing compilers are good and that we no longer have to write things in assembler for speed, but my compiler can't even replace i/=2 with a shift.

    20.15c How can I swap two values without using a temporary?

    20.16 Which is more efficient, a switch statement or an if/else chain?

    20.17 Is there a way to switch on strings?

    20.18 Is there a way to have non-constant case labels (i.e. ranges or arbitrary expressions)?

    20.19 Are the outer parentheses in return statements really optional?

    20.20 Why don't C comments nest? How am I supposed to comment out code containing comments? Are comments legal inside quoted strings?

    20.20b Why isn't there a numbered, multi-level break statement to break out of several loops at once? What am I supposed to use instead, a goto?

    20.21 There seem to be a few missing operators, like ^^, &&=, and ->=.

    20.21a Does C have circular shift operators?

    20.21b Is C a great language, or what? Where else could you write something like a+++++b ?

    20.22 If the assignment operator were :=, wouldn't it then be harder to accidentally write things like if(a = b) ?

    20.23 Does C have an equivalent to Pascal's with statement?

    20.24 Why doesn't C have nested functions?

    20.24b What is assert() and when would I use it?

    20.25 How can I call FORTRAN (C++, BASIC, Pascal, Ada, LISP) functions from C? (And vice versa?)

    20.26 Does anyone know of a program for converting Pascal or FORTRAN (or LISP, Ada, awk, ``Old'' C, ...) to C?

    20.27 Is C++ a superset of C? What are the differences between C and C++? Can I use a C++ compiler to compile C code?

    20.28 I need a sort of an ``approximate'' strcmp routine, for comparing two strings for close, but not necessarily exact, equality.

    20.29 What is hashing?

    20.30 How can I generate random numbers with a normal or Gaussian distribution?

    20.31 How can I find the day of the week given the date?

    20.32 Is (year % 4 == 0) an accurate test for leap years? (Was 2000 a leap year?)

    20.33 Why can tm_sec in the tm structure range from 0 to 61, suggesting that there can be 62 seconds in a minute?

    20.34 Here's a good puzzle: how do you write a program which produces its own source code as output?

    20.35 What is ``Duff's Device''?

    20.36 When will the next International Obfuscated C Code Contest (IOCCC) be held? How do I submit contest entries? Who won this year's IOCCC? How can I get a copy of the current and previous winning entries?

    20.37 What was the entry keyword mentioned in K&R1?

    20.38 Where does the name ``C'' come from, anyway?

    20.39 How do you pronounce ``char''? What's that funny name for the ``#'' character?

    20.39b What do ``lvalue'' and ``rvalue'' mean?

    20.40 Where can I get extra copies of this list?

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Ờ nhỉ, có nhiều câu hỏi mà Dreaminess cũng không tự trả lời được. Neverland87 có giải đáp của nó không vậy? Please gửi lên cho Dreaminess đi mà.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  6. #6
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Mặc định Những câu hỏi thường gặp trong C (tiếng Anh - không giải đáp)

    Mình nhớ trong ebook C++ FAQ có chứa những lời giải đáp các câu hỏi thường gặp trong C/C++ đó, có điều có thể không có những câu ở trên đâu đấy nhé. Chắc là DR có ebook này. Còn neverland, sẽ ráng tìm những câu trả lời của những câu hỏi trên, hi vọng là được để post cho anh em tham khảo

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Ặc đọc muốn xỉu luôn vì " có nhiều câu hỏi hay quá " mà toàn những câu mình hông bit không ? Tưởng có cái giải đáp ở dưới nên vội vã "seo" lại ai dè ..

    Nếu mà được thì các pro dịch và giải thích sơ sơ qua cho anh em hiểu đỡ thì tốt quá ( Nghe có vẻ mệt đấy )

  8. #8
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Hi, có giải đáp rồi đây, bà con từ từ mà xem nhé (hơi dài đó)
    -------------------------------------------------------------------------
    Section 1. Declarations and Initializations

    1.1: How do you decide which integer type to use?

    A: If you might need large values (tens of thousands), use long.
    Otherwise, if space is very important, use short. Otherwise,
    use int.

    1.4: What should the 64-bit type on a machine that can support it?

    A: C9X specifies long long.

    1.7: What's the best way to declare and define global variables?

    A: The best arrangement is to place each definition in some
    relevant .c file, with an external declaration in a header file.

    1.11: What does extern mean in a function declaration?

    A: Nothing, really; the keyword extern is optional here.

    1.12: What's the auto keyword good for?

    A: Nothing.

    1.14: I can't seem to define a linked list node which contains a
    pointer to itself.

    A: Structures in C can certainly contain pointers to themselves;
    the discussion and example in section 6.5 of K&R make this
    clear. Problems arise if an attempt is made to define (and use)
    a typedef in the midst of such a declaration; avoid this.

    1.21: How do I declare an array of N pointers to functions returning
    pointers to functions returning pointers to characters?

    A: char *(*(*a[N])())();
    Using a chain of typedefs, or the cdecl program, makes these
    declarations easier.

    1.22: How can I declare a function that returns a pointer to a
    function of its own type?

    A: You can't quite do it directly. Use a cast, or wrap a struct
    around the pointer and return that.

    1.25: My compiler is complaining about an invalid redeclaration of a
    function, but I only define it once.

    A: Calling an undeclared function declares it implicitly as
    returning int.

    1.25b: What's the right declaration for main()?

    A: See questions 11.12a to 11.15.

    1.30: What am I allowed to assume about the initial values
    of variables which are not explicitly initialized?

    A: Uninitialized variables with "static" duration start out as 0,
    as if the programmer had initialized them. Variables with
    "automatic" duration, and dynamically-allocated memory, start
    out containing garbage (with the exception of calloc).

    1.31: Why can't I initialize a local array with a string?

    A: Perhaps you have a pre-ANSI compiler.

    1.31b: What's wrong with "char *p = malloc(10);" ?

    A: Function calls are not allowed in initializers for global or
    static variables.

    1.32: What is the difference between char a[] = "string"; and
    char *p = "string"; ?

    A: The first declares an initialized and modifiable array; the
    second declares a pointer initialized to a not-necessarily-
    modifiable constant string.

    1.34: How do I initialize a pointer to a function?

    A: Use something like "extern int func(); int (*fp)() = func;" .


    Section 2. Structures, Unions, and Enumerations

    2.1: What's the difference between struct x1 { ... }; and
    typedef struct { ... } x2; ?

    A: The first structure is named by a tag, the second by a typedef
    name.

    2.2: Why doesn't "struct x { ... }; x thestruct;" work?

    A: C is not C++.

    2.3: Can a structure contain a pointer to itself?

    A: See question 1.14.

    2.4: What's the best way of implementing opaque (abstract) data types
    in C?

    A: One good way is to use structure pointers which point to
    structure types which are not publicly defined.

    2.6: I came across some code that declared a structure with the last
    member an array of one element, and then did some tricky
    allocation to make it act like the array had several elements.
    Is this legal or portable?

    A: An official interpretation has deemed that it is not strictly
    conforming with the C Standard.

    2.7: I heard that structures could be assigned to variables and
    passed to and from functions, but K&R1 says not.

    A: These operations are supported by all modern compilers.

    2.8: Is there a way to compare structures automatically?

    A: No.

    2.10: Can I pass constant values to functions which accept structure
    arguments?

    A: Not yet. As of this writing, C has no way of generating
    anonymous structure values.

    2.11: How can I read/write structures from/to data files?

    A: It is relatively straightforward to use fread and fwrite.

    2.12: How can I turn off structure padding?

    A: There is no standard method.

    2.13: Why does sizeof report a larger size than I expect for a
    structure type?

    A: The alignment of arrays of structures must be preserved.

    2.14: How can I determine the byte offset of a field within a
    structure?

    A: ANSI C defines the offsetof() macro, which should be used if
    available.

    2.15: How can I access structure fields by name at run time?

    A: Build a table of names and offsets, using the offsetof() macro.

    2.18: I have a program which works correctly, but dumps core after it
    finishes. Why?

    A: Check to see if a structure type declaration just before main()
    is missing its trailing semicolon, causing main() to be declared
    as returning a structure. See also questions 10.9 and 16.4.

    2.20: Can I initialize unions?

    A: The current C Standard allows an initializer for the first-named
    member.

    2.22: What is the difference between an enumeration and a set of
    preprocessor #defines?

    A: At the present time, there is little difference. The C Standard
    states that enumerations are compatible with integral types.

    2.24: Is there an easy way to print enumeration values symbolically?

    A: No.


    Section 3. Expressions

    3.1: Why doesn't the code "a[i] = i++;" work?

    A: The variable i is both referenced and modified in the same
    expression.

    3.2: Under my compiler, the code "int i = 7;
    printf("%d\n", i++ * i++);" prints 49. Regardless of the order
    of evaluation, shouldn't it print 56?

    A: The operations implied by the postincrement and postdecrement
    operators ++ and -- are performed at some time after the
    operand's former values are yielded and before the end of the
    expression, but not necessarily immediately after, or before
    other parts of the expression are evaluated.

    3.3: What should the code "int i = 3; i = i++;" do?

    A: The expression is undefined.

    3.3b: Here's a slick expression: "a ^= b ^= a ^= b". It swaps a and b
    without using a temporary.

    A: Not portably; its behavior is undefined.

    3.4: Don't precedence and parentheses dictate order of evaluation?

    A: Operator precedence and explicit parentheses impose only a
    partial ordering on the evaluation of an expression, which does
    not generally include the order of side effects.

    3.5: But what about the && and || operators?

    A: There is a special exception for those operators: left-to-right
    evaluation is guaranteed.

    3.8: What's a "sequence point"?

    A: A point (at the end of a full expression, or at the ||, &&, ?:,
    or comma operators, or just before a function call) at which all
    side effects are guaranteed to be complete.

    3.9: So given a[i] = i++; we don't know which cell of a[] gets
    written to, but i does get incremented by one, right?

    A: *No*. Once an expression or program becomes undefined, *all*
    aspects of it become undefined.

    3.12: If I'm not using the value of the expression, should I use i++
    or ++i to increment a variable?

    A: Since the two forms differ only in the value yielded, they are
    entirely equivalent when only their side effect is needed.

    3.14: Why doesn't the code "int a = 1000, b = 1000;
    long int c = a * b;" work?

    A: You must manually cast one of the operands to (long).

    3.16: Can I use ?: on the left-hand side of an assignment expression?

    A: No.


    Section 4. Pointers

    4.2: What's wrong with "char *p; *p = malloc(10);"?

    A: The pointer you declared is p, not *p.

    4.3: Does *p++ increment p, or what it points to?

    A: *p++ increments p. To increment the value pointed to by p, use
    (*p)++ .

    4.5: I want to use a char * pointer to step over some ints. Why
    doesn't "((int *)p)++;" work?

    A: In C, a cast operator is a conversion operator, and by
    definition it yields an rvalue, which cannot be assigned to, or
    incremented with ++.

    4.8: I have a function which accepts, and is supposed to initialize,
    a pointer, but the pointer in the caller remains unchanged.

    A: The called function probably altered only the passed copy of the
    pointer.

    4.9: Can I use a void ** pointer as a parameter so that a function
    can accept a generic pointer by reference?

    A: Not portably.

    4.10: I have a function which accepts a pointer to an int. How can I
    pass a constant like 5 to it?

    A: You will have to declare a temporary variable.

    4.11: Does C even have "pass by reference"?

    A: Not really, though it can be simulated.

    4.12: I've seen different methods used for calling functions via
    pointers.

    A: The extra parentheses and explicit * are now officially
    optional, although some older implementations require them.

  9. #9
    Ngày gia nhập
    01 2007
    Bài viết
    412

    ------------------------------------------------------------------
    Section 5. Null Pointers

    5.1: What is this infamous null pointer, anyway?

    A: For each pointer type, there is a special value -- the "null
    pointer" -- which is distinguishable from all other pointer
    values and which is not the address of any object or function.

    5.2: How do I get a null pointer in my programs?

    A: A constant 0 in a pointer context is converted into a null
    pointer at compile time. A "pointer context" is an
    initialization, assignment, or comparison with one side a
    variable or expression of pointer type, and (in ANSI standard C)
    a function argument which has a prototype in scope declaring a
    certain parameter as being of pointer type. In other contexts
    (function arguments without prototypes, or in the variable part
    of variadic function calls) a constant 0 with an appropriate
    explicit cast is required.

    5.3: Is the abbreviated pointer comparison "if(p)" to test for non-
    null pointers valid?

    A: Yes. The construction "if(p)" works, regardless of the internal
    representation of null pointers, because the compiler
    essentially rewrites it as "if(p != 0)" and goes on to convert 0
    into the correct null pointer.

    5.4: What is NULL and how is it #defined?

    A: NULL is simply a preprocessor macro, #defined as 0 (or
    ((void *)0)), which is used (as a stylistic convention, in
    preference to unadorned 0's) to generate null pointers.

    5.5: How should NULL be defined on a machine which uses a nonzero bit
    pattern as the internal representation of a null pointer?

    A: The same as on any other machine: as 0. (The compiler makes the
    translation, upon seeing a 0, not the preprocessor; see also
    question 5.4.)

    5.6: If NULL were defined as "((char *)0)," wouldn't that make
    function calls which pass an uncast NULL work?

    A: Not in general. The complication is that there are machines
    which use different internal representations for pointers to
    different types of data. A cast is still required to tell the
    compiler which kind of null pointer is required, since it may be
    different from (char *)0.

    5.9: If NULL and 0 are equivalent as null pointer constants, which
    should I use?

    A: Either; the distinction is entirely stylistic.

    5.10: But wouldn't it be better to use NULL, in case the value of NULL
    changes?

    A: No. NULL is a constant zero, so a constant zero is equally
    sufficient.

    5.12: I use the preprocessor macro "#define Nullptr(type) (type *)0"
    to help me build null pointers of the correct type.

    A: This trick, though valid, does not buy much.

    5.13: This is strange. NULL is guaranteed to be 0, but the null
    pointer is not?

    A: A "null pointer" is a language concept whose particular internal
    value does not matter. A null pointer is requested in source
    code with the character "0". "NULL" is a preprocessor macro,
    which is always #defined as 0 (or ((void *)0)).

    5.14: Why is there so much confusion surrounding null pointers?

    A: The fact that null pointers are represented both in source code,
    and internally to most machines, as zero invites unwarranted
    assumptions. The use of a preprocessor macro (NULL) may seem to
    suggest that the value could change some day, or on some weird
    machine.

    5.15: I'm confused. I just can't understand all this null pointer
    stuff.

    A: A simple rule is, "Always use `0' or `NULL' for null pointers,
    and always cast them when they are used as arguments in function
    calls."

    5.16: Given all the confusion surrounding null pointers, wouldn't it
    be easier simply to require them to be represented internally by
    zeroes?

    A: Such a requirement would accomplish little.

    5.17: Seriously, have any actual machines really used nonzero null
    pointers?

    A: Machines manufactured by Prime, Honeywell-Bull, and CDC, as well
    as Symbolics Lisp Machines, have done so.

    5.20: What does a run-time "null pointer assignment" error mean?

    A: It means that you've written, via a null pointer, to an invalid
    location. (See also question 16.8.)


    Section 6. Arrays and Pointers

    6.1: I had the definition char a[6] in one source file, and in
    another I declared extern char *a. Why didn't it work?

    A: The declaration extern char *a simply does not match the actual
    definition. Use extern char a[].

    6.2: But I heard that char a[] was identical to char *a.

    A: Not at all. Arrays are not pointers. A reference like x[3]
    generates different code depending on whether x is an array or a
    pointer.

    6.3: So what is meant by the "equivalence of pointers and arrays" in
    C?

    A: An lvalue of type array-of-T which appears in an expression
    decays into a pointer to its first element; the type of the
    resultant pointer is pointer-to-T. So for an array a and
    pointer p, you can say "p = a;" and then p[3] and a[3] will
    access the same element.

    6.4: Why are array and pointer declarations interchangeable as
    function formal parameters?

    A: It's supposed to be a convenience.

    6.7: How can an array be an lvalue, if you can't assign to it?

    A: An array is not a "modifiable lvalue."

    6.8: What is the real difference between arrays and pointers?

    A: Arrays automatically allocate space which is fixed in size and
    location; pointers are dynamic.

    6.9: Someone explained to me that arrays were really just constant
    pointers.

    A: An array name is "constant" in that it cannot be assigned to,
    but an array is *not* a pointer.

    6.11: I came across some "joke" code containing the "expression"
    5["abcdef"] . How can this be legal C?

    A: Yes, array subscripting is commutative in C. The array
    subscripting operation a[e] is defined as being identical to
    *((a)+(e)).

    6.12: What's the difference between array and &array?

    A: The type.

    6.13: How do I declare a pointer to an array?

    A: Usually, you don't want to. Consider using a pointer to one of
    the array's elements instead.

    6.14: How can I set an array's size at run time?

    A: It's straightforward to use malloc() and a pointer.

    6.15: How can I declare local arrays of a size matching a passed-in
    array?

    A: Until recently, you couldn't; array dimensions had to be compile-
    time constants. C9X will fix this.

    6.16: How can I dynamically allocate a multidimensional array?

    A: The traditional solution is to allocate an array of pointers,
    and then initialize each pointer to a dynamically-allocated
    "row." See the full list for code samples.

    6.17: Can I simulate a non-0-based array with a pointer?

    A: Not if the pointer points outside of the block of memory it is
    intended to access.

    6.18: My compiler complained when I passed a two-dimensional array to
    a function expecting a pointer to a pointer.

    A: The rule by which arrays decay into pointers is not applied
    recursively. An array of arrays (i.e. a two-dimensional array
    in C) decays into a pointer to an array, not a pointer to a
    pointer.

    6.19: How do I write functions which accept two-dimensional arrays
    when the width is not known at compile time?

    A: It's not always particularly easy.

    6.20: How can I use statically- and dynamically-allocated
    multidimensional arrays interchangeably when passing them to
    functions?

    A: There is no single perfect method, but see the full list for
    some ideas.

    6.21: Why doesn't sizeof properly report the size of an array which is
    a parameter to a function?

    A: The sizeof operator reports the size of the pointer parameter
    which the function actually receives.


    Section 7. Memory Allocation

    7.1: Why doesn't the code "char *answer; gets(answer);" work?

    A: The pointer variable answer has not been set to point to any
    valid storage. The simplest way to correct this fragment is to
    use a local array, instead of a pointer.

    7.2: I can't get strcat() to work. I tried "char *s3 =
    strcat(s1, s2);" but I got strange results.

    A: Again, the main problem here is that space for the concatenated
    result is not properly allocated.

    7.3: But the man page for strcat() says that it takes two char *'s as
    arguments. How am I supposed to know to allocate things?

    A: In general, when using pointers you *always* have to consider
    memory allocation, if only to make sure that the compiler is
    doing it for you.

    7.3b: I just tried the code "char *p; strcpy(p, "abc");" and it
    worked. Why didn't it crash?

    A: You got "lucky".

    7.3c: How much memory does a pointer variable allocate?

    A: Only enough memory to hold the pointer itself, not any memory
    for the pointer to point to.

    7.5a: I have a function that is supposed to return a string, but when
    it returns to its caller, the returned string is garbage.

    A: Make sure that the pointed-to memory is properly (i.e. not
    locally) allocated.

    7.5b: So what's the right way to return a string?

    A: Return a pointer to a statically-allocated buffer, a buffer
    passed in by the caller, or memory obtained with malloc().

    7.6: Why am I getting "warning: assignment of pointer from integer
    lacks a cast" for calls to malloc()?

    A: Have you #included <stdlib.h>?

    7.7: Why does some code carefully cast the values returned by malloc
    to the pointer type being allocated?

    A: Before ANSI/ISO C, these casts were required to silence certain
    warnings.

    7.8: Why does so much code leave out the multiplication by
    sizeof(char) when allocating strings?

    A: Because sizeof(char) is, by definition, exactly 1.

    7.14: I've heard that some operating systems don't actually allocate
    malloc'ed memory until the program tries to use it. Is this
    legal?

    A: It's hard to say.

    7.16: I'm allocating a large array for some numeric work, but malloc()
    is acting strangely.

    A: Make sure the number you're trying to pass to malloc() isn't
    bigger than a size_t can hold.

    7.17: I've got 8 meg of memory in my PC. Why can I only seem to
    malloc 640K or so?

    A: Under the segmented architecture of PC compatibles, it can be
    difficult to use more than 640K with any degree of transparency.
    See also question 19.23.

    7.19: My program is crashing, apparently somewhere down inside malloc.

    A: Make sure you aren't using more memory than you malloc'ed,
    especially for strings (which need strlen(str) + 1 bytes).

    7.20: You can't use dynamically-allocated memory after you free it,
    can you?

    A: No. Some early documentation implied otherwise, but the claim
    is no longer valid.

    7.21: Why isn't a pointer null after calling free()?

    A: C's pass-by-value semantics mean that called functions can never
    permanently change the values of their arguments.

    7.22: When I call malloc() to allocate memory for a local pointer, do
    I have to explicitly free() it?

    A: Yes.

    7.23: When I free a dynamically-allocated structure containing
    pointers, do I also have to free each subsidiary pointer?

    A: Yes.

    7.24: Must I free allocated memory before the program exits?

    A: You shouldn't have to.

    7.25: Why doesn't my program's memory usage go down when I free
    memory?

    A: Most implementations of malloc/free do not return freed memory
    to the operating system.

    7.26: How does free() know how many bytes to free?

    A: The malloc/free implementation remembers the size of each block
    as it is allocated.

    7.27: So can I query the malloc package to find out how big an
    allocated block is?

    A: Not portably.

    7.30: Is it legal to pass a null pointer as the first argument to
    realloc()?

    A: ANSI C sanctions this usage, although several earlier
    implementations do not support it.

    7.31: What's the difference between calloc() and malloc()?

    A: calloc() takes two arguments, and initializes the allocated
    memory to all-bits-0.

    7.32: What is alloca() and why is its use discouraged?

    A: alloca() allocates memory which is automatically freed when the
    function which called alloca() returns. alloca() cannot be
    written portably, is difficult to implement on machines without
    a stack, and fails under certain conditions if implemented
    simply.


    Section 8. Characters and Strings

    8.1: Why doesn't "strcat(string, '!');" work?

    A: strcat() concatenates *strings*, not characters.

    8.2: Why won't the test if(string == "value") correctly compare
    string against the value?

    A: It's comparing pointers. To compare two strings, use strcmp().

    8.3: Why can't I assign strings to character arrays?

    A: Strings are arrays, and you can't assign arrays directly. Use
    strcpy() instead.

    8.6: How can I get the numeric (character set) value corresponding to
    a character?

    A: In C, if you have the character, you have its value.

    8.9: Why is sizeof('a') not 1?

    A: Character constants in C are of type int.


    Section 9. Boolean Expressions and Variables

    9.1: What is the right type to use for Boolean values in C?

    A: There's no one right answer; see the full list for some
    discussion.

    9.2: What if a built-in logical or relational operator "returns"
    something other than 1?

    A: When a Boolean value is generated by a built-in operator, it is
    guaranteed to be 1 or 0. (This is *not* true for some library
    routines such as isalpha.)

    9.3: Is if(p), where p is a pointer, valid?

    A: Yes. See question 5.3.


    Section 10. C Preprocessor

    10.2: I've got some cute preprocessor macros that let me write C code
    that looks more like Pascal. What do y'all think?

    A: Bleah.

    10.3: How can I write a generic macro to swap two values?

    A: There is no good answer to this question. The best all-around
    solution is probably to forget about using a macro.

    10.4: What's the best way to write a multi-statement macro?

    A: #define Func() do {stmt1; stmt2; ... } while(0) /* (no trailing */

    10.6: What are .h files and what should I put in them?

    A: Header files (also called ".h files") should generally contain
    common declarations and macro, structure, and typedef
    definitions, but not variable or function definitions.

    10.7: Is it acceptable for one header file to #include another?

    A: It's a question of style, and thus receives considerable debate.

    10.8a: What's the difference between #include <> and #include "" ?

    A: Roughly speaking, the <> syntax is for Standard headers and ""
    is for project headers.

    10.8b: What are the complete rules for header file searching?

    A: The exact behavior is implementation-defined; see the full list
    for some discussion.

    10.9: I'm getting strange syntax errors on the very first declaration
    in a file, but it looks fine.

    A: Perhaps there's a missing semicolon at the end of the last
    declaration in the last header file you're #including.

    10.10b: I'm #including the header file for a function, but the linker
    keeps saying it's undefined.

    A: See question 13.25.

    10.11: Where can I get a copy of a missing header file?

    A: Contact your vendor, or see question 18.16 or the full list.

    10.12: How can I construct preprocessor #if expressions which compare
    strings?

    A: You can't do it directly; try #defining several manifest
    constants and implementing conditionals on those.

    10.13: Does the sizeof operator work in preprocessor #if directives?

    A: No.

    10.14: Can I use an #ifdef in a #define line, to define something two
    different ways?

    A: No.

    10.15: Is there anything like an #ifdef for typedefs?

    A: Unfortunately, no.

    10.16: How can I use a preprocessor #if expression to detect
    endianness?

    A: You probably can't.

    10.18: How can I preprocess some code to remove selected conditional
    compilations, without preprocessing everything?

    A: Look for a program called unifdef, rmifdef, or scpp.

    10.19: How can I list all of the predefined identifiers?

    A: If the compiler documentation is unhelpful, try extracting
    printable strings from the compiler or preprocessor executable.

    10.20: I have some old code that tries to construct identifiers with a
    macro like "#define Paste(a, b) a/**/b", but it doesn't work any
    more.

    A: Try the ANSI token-pasting operator ##.

    10.22: What does the message "warning: macro replacement within a
    string literal" mean?

    A: See question 11.18.

    10.23-4: I'm having trouble using macro arguments inside string
    literals, using the `#' operator.

    A: See questions 11.17 and 11.18.

    10.25: I've got this tricky preprocessing I want to do and I can't
    figure out a way to do it.

    A: Consider writing your own little special-purpose preprocessing
    tool, instead.

    10.26: How can I write a macro which takes a variable number of
    arguments?

    A: Here is one popular trick. Note that the parentheses around
    printf's argument list are in the macro call, not the
    definition.

    #define DEBUG(args) (printf("DEBUG: "), printf args)

    if(n != 0) DEBUG(("n is %d\n", n));

  10. #10
    Ngày gia nhập
    01 2007
    Bài viết
    412

    --------------------------------------------------------------------
    Section 11. ANSI/ISO Standard C

    11.1: What is the "ANSI C Standard?"

    A: In 1983, the American National Standards Institute (ANSI)
    commissioned a committee to standardize the C language. Their
    work was ratified as ANS X3.159-1989, and has since been adopted
    as ISO/IEC 9899:1990, and later amended.

    11.2: How can I get a copy of the Standard?

    A: Copies are available from ANSI in New York, or from Global
    Engineering Documents in Englewood, CO, or from any national
    standards body, or from ISO in Geneva, or republished within one
    or more books. See the unabridged list for details.

    11.2b: Where can I get information about updates to the Standard?

    A: See the full list for pointers.

    11.3: My ANSI compiler is complaining about prototype mismatches for
    parameters declared float.

    A: You have mixed the new-style prototype declaration
    "extern int func(float);" with the old-style definition
    "int func(x) float x;". "Narrow" types are treated differently
    according to which syntax is used. This problem can be fixed by
    avoiding narrow types, or by using either new-style (prototype)
    or old-style syntax consistently.

    11.4: Can you mix old-style and new-style function syntax?

    A: Doing so is currently legal, for most argument types
    (see question 11.3).

    11.5: Why does the declaration "extern int f(struct x *p);" give me a
    warning message?

    A: A structure declared (or even mentioned) for the first time
    within a prototype cannot be compatible with other structures
    declared in the same source file.

    11.8: Why can't I use const values in initializers and array
    dimensions?

    A: The value of a const-qualified object is *not* a constant
    expression in the full sense of the term.

    11.9: What's the difference between "const char *p" and
    "char * const p"?

    A: The former declares a pointer to a constant character; the
    latter declares a constant pointer to a character.

    11.10: Why can't I pass a char ** to a function which expects a
    const char **?

    A: The rule which permits slight mismatches in qualified pointer
    assignments is not applied recursively.

    11.12a: What's the correct declaration of main()?

    A: int main(int argc, char *argv[]) .

    11.12b: Can I declare main() as void, to shut off these annoying "main
    returns no value" messages?

    A: No.

    11.13: But what about main's third argument, envp?

    A: It's a non-standard (though common) extension.

    11.14: I believe that declaring void main() can't fail, since I'm
    calling exit() instead of returning.

    A: It doesn't matter whether main() returns or not, the problem is
    that its caller may not even be able to *call* it correctly.

    11.15: The book I've been using always uses void main().

    A: It's wrong.

    11.16: Is exit(status) truly equivalent to returning the same status
    from main()?

    A: Yes and no. (See the full list for details.)

    11.17: How do I get the ANSI "stringizing" preprocessing operator `#'
    to stringize the macro's value instead of its name?

    A: You can use a two-step #definition to force a macro to be
    expanded as well as stringized.

    11.18: What does the message "warning: macro replacement within a
    string literal" mean?

    A: Some pre-ANSI compilers/preprocessors expanded macro parameters
    even inside string literals and character constants.

    11.19: I'm getting strange syntax errors inside lines I've #ifdeffed
    out.

    A: Under ANSI C, #ifdeffed-out text must still consist of "valid
    preprocessing tokens." This means that there must be no
    newlines inside quotes, and no unterminated comments or quotes
    (i.e. no single apostrophes).

    11.20: What are #pragmas ?

    A: The #pragma directive provides a single, well-defined "escape
    hatch" which can be used for extensions.

    11.21: What does "#pragma once" mean?

    A: It is an extension implemented by some preprocessors to help
    make header files idempotent.

    11.22: Is char a[3] = "abc"; legal?

    A: Yes, in ANSI C.

    11.24: Why can't I perform arithmetic on a void * pointer?

    A: The compiler doesn't know the size of the pointed-to objects.

    11.25: What's the difference between memcpy() and memmove()?

    A: memmove() offers guaranteed behavior if the source and
    destination arguments overlap.

    11.26: What should malloc(0) do?

    A: The behavior is implementation-defined.

    11.27: Why does the ANSI Standard not guarantee more than six case-
    insensitive characters of external identifier significance?

    A: The problem is older linkers which cannot be forced (by mere
    words in a Standard) to upgrade.

    11.29: My compiler is rejecting the simplest possible test programs,
    with all kinds of syntax errors.

    A: Perhaps it is a pre-ANSI compiler.

    11.30: Why are some ANSI/ISO Standard library functions showing up as
    undefined, even though I've got an ANSI compiler?

    A: Perhaps you don't have ANSI-compatible headers and libraries.

    11.31: Does anyone have a tool for converting old-style C programs to
    ANSI C, or for automatically generating prototypes?

    A: See the full list for details.

    11.32: Why won't frobozz-cc, which claims to be ANSI compliant, accept
    this code?

    A: Are you sure that the code being rejected doesn't rely on some
    non-Standard extension?

    11.33: What's the difference between implementation-defined,
    unspecified, and undefined behavior?

    A: If you're writing portable code, ignore the distinctions.
    Otherwise, see the full list.

    11.34: I'm appalled that the ANSI Standard leaves so many issues
    undefined.

    A: In most of these cases, the Standard is simply codifying
    existing practice.

    11.35: I just tried some allegedly-undefined code on an ANSI-conforming
    compiler, and got the results I expected.

    A: A compiler may do anything it likes when faced with undefined
    behavior, including doing what you expect.


    Section 12. Stdio

    12.1: What's wrong with the code "char c; while((c = getchar()) !=
    EOF) ..."?

    A: The variable to hold getchar's return value must be an int.

    12.2: Why won't the code "while(!feof(infp)) {
    fgets(buf, MAXLINE, infp); fputs(buf, outfp); }" work?

    A: EOF is only indicated *after* an input routine fails.

    12.4: My program's prompts and intermediate output don't always show
    up on the screen.

    A: It's best to use an explicit fflush(stdout) whenever output
    should definitely be visible.

    12.5: How can I read one character at a time, without waiting for the
    RETURN key?

    A: See question 19.1.

    12.6: How can I print a '%' character with printf?

    A: "%%".

    12.9: How can printf() use %f for type double, if scanf() requires
    %lf?

    A: C's "default argument promotions" mean that values of type float
    are promoted to double.

    12.9b: What printf format should I use for a typedef when I don't know
    the underlying type?

    A: Use a cast to convert the value to a known type, then use the
    printf format matching that type.

    12.10: How can I implement a variable field width with printf?

    A: Use printf("%*d", width, x).

    12.11: How can I print numbers with commas separating the thousands?

    A: There is no standard routine (but see <locale.h>).

    12.12: Why doesn't the call scanf("%d", i) work?

    A: The arguments you pass to scanf() must always be pointers.

    12.13: Why doesn't the code "double d; scanf("%f", &d);" work?

    A: Unlike printf(), scanf() uses %lf for double, and %f for float.

    12.15: How can I specify a variable width in a scanf() format string?

    A: You can't.

    12.17: When I read numbers from the keyboard with scanf "%d\n", it
    seems to hang until I type one extra line of input.

    A: Try using "%d" instead of "%d\n".

    12.18: I'm reading a number with scanf %d and then a string with
    gets(), but the compiler seems to be skipping the call to
    gets()!

    A: scanf() and gets() do not work well together.

    12.19: I'm re-prompting the user if scanf() fails, but sometimes it
    seems to go into an infinite loop.

    A: scanf() tends to "jam" on bad input since it does not discard
    it.

    12.20: Why does everyone say not to use scanf()? What should I use
    instead?

    A: scanf() has a number of problems. Usually, it's easier to read
    entire lines and then interpret them.

    12.21: How can I tell how much destination buffer space I'll need for
    an arbitrary sprintf call? How can I avoid overflowing the
    destination buffer with sprintf()?

    A: Use the new snprintf() function, if you can.

    12.23: Why does everyone say not to use gets()?

    A: It cannot be prevented from overflowing the input buffer.

    12.24: Why does errno contain ENOTTY after a call to printf()?

    A: Don't worry about it. It is only meaningful for a program to
    inspect the contents of errno after an error has been reported.

    12.25: What's the difference between fgetpos/fsetpos and ftell/fseek?

    A: fgetpos() and fsetpos() use a special typedef which may allow
    them to work with larger files than ftell() and fseek().

    12.26: Will fflush(stdin) flush unread characters from the standard
    input stream?

    A: No.

    12.30: I'm trying to update a file in place, by using fopen mode "r+",
    but it's not working.

    A: Be sure to call fseek between reading and writing.

    12.33: How can I redirect stdin or stdout from within a program?

    A: Use freopen().

    12.34: Once I've used freopen(), how can I get the original stream
    back?

    A: There isn't a good way. Try avoiding freopen.

    12.36b: How can I arrange to have output go two places at once?

    A: You could write your own printf variant which printed everything
    twice. See question 15.5.

    12.38: How can I read a binary data file properly?

    A: Be sure to specify "rb" mode when calling fopen().


    Section 13. Library Functions

    13.1: How can I convert numbers to strings?

    A: Just use sprintf().

    13.2: Why does strncpy() not always write a '\0'?

    A: For mildly-interesting historical reasons.

    13.5: Why do some versions of toupper() act strangely if given an
    upper-case letter?

    A: Older versions of toupper() and tolower() did not always work as
    expected in this regard.

    13.6: How can I split up a string into whitespace-separated fields?

    A: Try strtok().

    13.7: I need some code to do regular expression and wildcard matching.

    A: regexp libraries abound; see the full list for details.

    13.8: I'm trying to sort an array of strings with qsort(), using
    strcmp() as the comparison function, but it's not working.

    A: You'll have to write a "helper" comparison function which takes
    two generic pointer arguments, converts them to char **, and
    dereferences them, yielding char *'s which can be usefully
    compared.

    13.9: Now I'm trying to sort an array of structures, but the compiler
    is complaining that the function is of the wrong type for
    qsort().

    A: The comparison function must be declared as accepting "generic
    pointers" (const void *) which it then converts to structure
    pointers.

    13.10: How can I sort a linked list?

    A: Algorithms like insertion sort and merge sort work well, or you
    can keep the list in order as you build it.

    13.11: How can I sort more data than will fit in memory?

    A: You want an "external sort"; see the full list for details.

    13.12: How can I get the time of day in a C program?

    A: Just use the time(), ctime(), localtime() and/or strftime()
    functions.

    13.13: How can I convert a struct tm or a string into a time_t?

    A: The ANSI mktime() function converts a struct tm to a time_t. No
    standard routine exists to parse strings.

    13.14: How can I perform calendar manipulations?

    A: The ANSI/ISO Standard C mktime() and difftime() functions
    provide some support for both problems.

    13.14b: Does C have any Year 2000 problems?

    A: No, although poorly-written C programs do. Make sure you know
    that tm_year holds the value of the year minus 1900.

    13.15: I need a random number generator.

    A: The Standard C library has one: rand().

    13.16: How can I get random integers in a certain range?

    A: One method is something like

    (int)((double)rand() / ((double)RAND_MAX + 1) * N)

    13.17: Each time I run my program, I get the same sequence of numbers
    back from rand().

    A: You can call srand() to seed the pseudo-random number generator
    with a truly random initial value.

    13.18: I need a random true/false value, so I'm just taking rand() % 2,
    but it's alternating 0, 1, 0, 1, 0...

    A: Try using the higher-order bits: see question 13.16.

    13.20: How can I generate random numbers with a normal or Gaussian
    distribution?

    A: See the longer versions of this list for ideas.

    13.24: I'm trying to port this old program. Why do I get "undefined
    external" errors for some library functions?

    A: Some semistandard functions have been renamed or replaced over
    the years; see the full list for details.

    13.25: I get errors due to library functions being undefined even
    though I #include the right header files.

    A: You may have to explicitly ask for the correct libraries to be
    searched.

    13.26: I'm still getting errors due to library functions being
    undefined, even though I'm requesting the right libraries.

    A: Library search order is significant; usually, you must search
    the libraries last.

    13.28: What does it mean when the linker says that _end is undefined?

    A: You generally get that message only when other symbols are
    undefined, too.


    Section 14. Floating Point

    14.1: When I set a float variable to 3.1, why is printf printing it as
    3.0999999?

    A: Most computers use base 2 for floating-point numbers, and many
    fractions (including 0.1 decimal) are not exactly representable
    in base 2.

    14.2: Why is sqrt(144.) giving me crazy numbers?

    A: Make sure that you have #included <math.h>, and correctly
    declared other functions returning double.

    14.3: I keep getting "undefined: sin" compilation errors.

    A: Make sure you're actually linking with the math library.

    14.4: My floating-point calculations are acting strangely and giving
    me different answers on different machines.

    A: First, see question 14.2 above. If the problem isn't that
    simple, see the full list for a brief explanation, or any good
    programming book for a better one.

    14.5: What's a good way to check for "close enough" floating-point
    equality?

    A: The best way is to use an accuracy threshold which is relative
    to the magnitude of the numbers being compared.

    14.6: How do I round numbers?

    A: For positive numbers, try (int)(x + 0.5) .

    14.7: Where is C's exponentiation operator?

    A: Try using the pow() function.

    14.8: The predefined constant M_PI seems to be missing from <math.h>.

    A: That constant is not standard.

    14.9: How do I test for IEEE NaN and other special values?

    A: There is not yet a portable way, but see the full list for
    ideas.

    14.11: What's a good way to implement complex numbers in C?

    A: It is straightforward to define a simple structure and some
    arithmetic functions to manipulate them.

    14.12: I'm looking for some mathematical library code.

    A: See Ajay Shah's index of free numerical software at
    ftp://ftp.math.psu.edu/pub/FAQ/numcomp-free-c .

    14.13: I'm having trouble with a Turbo C program which crashes and says
    something like "floating point formats not linked."

    A: You may have to insert a dummy call to a floating-point library
    function to force loading of floating-point support.


    Section 15. Variable-Length Argument Lists

    15.1: I heard that you have to #include <stdio.h> before calling
    printf(). Why?

    A: So that a proper prototype for printf() will be in scope.

    15.2: How can %f be used for both float and double arguments in
    printf()?

    A: In variable-length argument lists, types char and short int are
    promoted to int, and float is promoted to double.

    15.3: Why don't function prototypes guard against mismatches in
    printf's arguments?

    A: Function prototypes do not provide any information about the
    number and types of variable arguments.

    15.4: How can I write a function that takes a variable number of
    arguments?

    A: Use the <stdarg.h> header.

    15.5: How can I write a function that takes a format string and a
    variable number of arguments, like printf(), and passes them to
    printf() to do most of the work?

    A: Use vprintf(), vfprintf(), or vsprintf().

    15.6: How can I write a function analogous to scanf(), that calls
    scanf() to do most of the work?

    A: C9X will support vscanf().

    15.7: I have a pre-ANSI compiler, without <stdarg.h>. What can I do?

    A: There's an older header, <varargs.h>, which offers about the
    same functionality.

    15.8: How can I discover how many arguments a function was actually
    called with?

    A: Any function which takes a variable number of arguments must be
    able to determine *from the arguments' values* how many of them
    there are.

    15.9: My compiler isn't letting me declare a function that accepts
    *only* variable arguments.

    A: Standard C requires at least one fixed argument.

    15.10: Why isn't "va_arg(argp, float)" working?

    A: Because the "default argument promotions" apply in variable-
    length argument lists, you should always use
    va_arg(argp, double).

    15.11: I can't get va_arg() to pull in an argument of type pointer-to-
    function.

    A: Use a typedef.

    15.12: How can I write a function which takes a variable number of
    arguments and passes them to some other function ?

    A: In general, you cannot.

    15.13: How can I call a function with an argument list built up at run
    time?

    A: You can't.

Các đề tài tương tự

  1. Ý kiến Chỉ một từ đơn giản trong tiếng Anh: Ban
    Gửi bởi Wazi Armstrong trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 10
    Bài viết cuối: 22-04-2012, 09:22 PM
  2. Giao tiếp với cmd trong lập trình C#?
    Gửi bởi anhlavip_10a4 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 06-09-2011, 07:48 AM
  3. giao tiếp cổng com và lấy ngày giờ trong lập trình C#?
    Gửi bởi pqtung68 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 01-04-2011, 08:04 AM
  4. Algorithm Giao tiếp với HĐH trong lập trình C#?
    Gửi bởi Nerjrofy trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 21-03-2011, 08:16 AM
  5. Code chương trình giao tiếp giứa 2 tiến trình trong Windows
    Gửi bởi cutithongtin trong diễn đàn Thắc mắc chung
    Trả lời: 14
    Bài viết cuối: 19-04-2010, 08:51 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn