The C Programming Language

  • 在binary search中,如果全部都是通过ptr来操作原数组,需要注意mid = low + (high - low) / 2.
    • 原因在于指针是不可以相加的。而substraction is legal,结果就是两个指针(往往是同一数组内的)的offset的差值。
  • 对于一个大小为n的数组s,访问它的&s[n](i.e. s+n) is legal,dereferencing it is illegal.然而对于s[-1]是完全illegal。
  • 不要认为一个struct的大小就是所有member大小之和。
    • 为了对齐的要求(内存中),there may be unnamed holes in a structure.
struct {
    char c;
    int i;
};

需要8个bytes,而不是5个。sizeof works properly here.

for (ptr = head; ptr != NULL; p=p->Next) {
}

是walk through linked list idiom.

  • (the ptr type)malloc(sizeof(whatever you want)).malloc的返回值是void,需要显式cast到想要的类型

  • 在C语言中,用-表示空格。printf中,%s的几种变体:%.*s(接参数), %.10s(经测试,只有precision小于字符串长度的时候才有效,没有'.'也无效), %-10s(改为左对齐(默认情况下是右对齐),字符不够用空格补), %15.10s(取10个字符,总共占15个字符长度,不够的用空格补足,right alignment), %-15.10s同上,left alignment.

  • sprintf作用是把一个字符串格式化然后放入一个buffer字符串中,之后就可以使用这个字符串,而不必自己进行对字符数组的操作,十分方便.(buffer must be big enough to receive the result)

  • 实现minprintf的tricky bit is how minprintf walks along the argument list when list doesn't even have a name.

  • scanf: except the 1st, the other arguments, each of which must be a pointer, indicate where the corresponding converted input should be stored.

  • scanf: returning 0 means the next input character does not match the first specification in the format string.The next call to scanf resumes searching immediately after the last character already converted.

  • sscanf: reads from a string instead of the standard input.return the items assigned value successfully.

  • scanf: an input field is defined as a string of non-while space characters; it extends either to the next while space or until the field width.(WHITE-SPACE characters are blank, tab, newline(\n), carriage return(return key), veritcal tab, formfeed(进纸页))

  • No & is used with array name since it is a pointer.

  • scanf skips over white space(blank, tabs, newlines, etc) as it looks for input values.

  • scanf: to read input whose format is not fixed, it is often best to read a line at a time, then pick it apart with sscanf.(nice stratage!)

Example:

while (getline(line, sizeof(line)) > 0) {
    if (sscanf(line, "%d %s %d", &day, monthname, &year) == 3) {
        printf("valid: %s\n", line);
    }else if (sscanf(line, "%d/%d/%d", &month, monthname, &year) == 3) {
        printf("valid: %s\n", line);
    }else {
        printf("invalid %s\n", line);
    }
}
  • binsearch on K & R C:
int binsearch(int x, int v[], int n) {
    int low, high, mid;
    low = 0;
    high = n - 1;
    while (low <= high){
        mid = (low + high)/2;
        if (x < v[mid]) {
            high = mid - 1;
        }else if (x > v[mid]) {
            low = mid + 1;
        }else {
            return mid;//Found match
        }
    }
    return -1;//no match
}

你可能感兴趣的:(The C Programming Language)