2010年12月31日 星期五

100

main(){{}{}{}

   {;;;;;;}
 {          }
{            }
{            }
{            }
 {          }
   {;;;;;;}

   {;;;;;;}
 {          }
{            }
{            }
{            }
 {          }
   {;;;;;;}}

2010年12月29日 星期三

Cannot open that file

Cannot open that file.
int main()
{
  char filename[80];
  FILE *fp;
  printf("input file name: ");
  fgets(filename, 79, stdin);
  fp = fopen(filename, "r");
  assert(fp != NULL);
  fclose(fp);
}
C:\SVN\book\C>ls -l fgets.c
-rw-rw-rw-   1 user     group         225 Dec 29 17:23 fgets.c
C:\SVN\book\C>a.exe
input file name: fgets.c
Assertion failed: fp != NULL, file fgets.c, line 10

2010年12月27日 星期一

變數靈異事件

#include <stdio.h>
#include <string.h>
int main(void)
{
  char source[] = "This is a string.";
  int i = 5;
  char destination[4];
  strcpy(destination, source);
  printf("i is %d\n", i);
  printf("source is [%s]\n", source);
  printf("destination is [%s]\n", destination);
  return 0;
}
The output.
i is 544434464
source is [a string.]
destination is [This is a string.]

CSIE rules!

struct csie {
  char c;
  short s;
  int i;
  double e;
};  
struct ceis {
  char c;
  double e;
  int i;
  short s;
};  
int main(void)
{
  printf("csie = %d\n", sizeof(struct csie));
  printf("ceis = %d\n", sizeof(struct ceis));
  return 0;
}
The output.
csie = 16
ceis = 24

2010年12月26日 星期日

一個打十個

之前的恆等式可能不好了解. 換這個試看看.

#include <stdio.h>
int main()
{
  int a[10];
  if (a == &a)
    printf("yes\n");
  else
    printf("no\n");

  if (a + 10 == &a + 1)
    printf("yes\n");
  else
    printf("no\n");
}

輸出變這樣.

yes
yes

7 * 7 = 19

The output is 19, not 49.

#include <stdio.h>
#define square(x) (x * x)
int main()
{
  int i = 3;
  int j = 4;
  printf("%d\n", square(i + j));
}

為何不用 char c 寫檔

有朋友問到之前 255 and 256 的例子為何不用 char c 寫檔.
如果你的膽子和硬碟都很大, 請自行嘗試. 後果P老師概不負責.

#include <stdio.h>

int main(void)
{
  FILE *fp;
  char c;
  fp = fopen("file", "wb");
  for (c = 0; c < 256; c++)
    fputc(c, fp);
  fclose(fp);
  return 0;
}

2010年12月25日 星期六

多一個位元組

在Window下執行, 結果 file 的長度是 7?

#include <stdio.h>
int main(void)
{
  FILE *fp;
  fp = fopen("file", "w");
  fputs("hello\n", fp);
  fclose(fp);
  return 0;
}

恆等式

等式左右各加一, 就不是等式了?

#include <stdio.h>
int main()
{
  int a[10];
  if (a == &a)
    printf("yes\n");
  else
    printf("no\n");

  if (a + 1 == &a + 1)
    printf("yes\n");
  else
    printf("no\n");
}

輸出是這樣.

yes
no

2010年12月24日 星期五

What you see is not what you get

#include <stdio.h>

int main()
{
  long int my_fax_number = 0233662167;
  printf("my fax number is %ld\n", my_fax_number);
  return 0;
}

The output.

my fax number is 40854647

差之毫釐, 失之千里.

The output is "no".

#include <stdio.h>

int main()
{
  float a = 1.134;
  float b = 3.402;
  if (a * 3 == b)
    printf("yes");
  else
    printf("no");
}

2010年12月22日 星期三

無形相的指標

很多函式 (例如 fread) 中緩衝區的型態是 *void。
簡單的來說,就是不指向任何有形相的資料。
每當我看到這個 *void,就會想到金剛經的這句話。

所有一切眾生之類,若卵生、若胎生、若濕生、若化生;若有色、若無色;
若有想、若無想;若非有想,若非無想,我皆令入無餘涅槃,而滅度之。

今天無論是整數,浮點數,或是字元,我都令入無餘記憶體,而滅度之。
記憶體裡的位元組,無非是一些高低電壓而已。
所謂資料型態,只是在你的眼中存在而已,事實上哪裡存在呢?
雖然如此,我還是必須用一個指標來表示這些我眼中的資料。
既然無論什麼形相事實上都不存在,那就用一個沒有形相的指標,這樣不就對了嗎?

2010年12月21日 星期二

255 and 256

The output is count = 255
We did write 256 characters, Why do we only get 255 of them?

#include <stdio.h>

int main(void)
{
  FILE *fp;
  char c;
  int count;
  int i;
  fp = fopen("file", "wb");
  for (i = 0; i < 256; i++)
    fputc(i, fp);
  fclose(fp);
  fp = fopen("file", "rb");
  count = 0;
  while ((c = fgetc(fp)) != EOF)
    count++;
  printf("count = %d\n", count);
  return 0;
}

2010年12月20日 星期一

電腦在偷懶?

兩次的輸出不一樣??? 是不是電腦在偷懶?


this
is
a
string
this


#include <stdio.h>
#include <string.h>
int main(void)
{
  char string[] = "this is a string";
  char *start;

  start = string;
  start = strtok(start, " ");
  while (start != NULL) {
    printf("%s\n", start);
    start = strtok(NULL, " ");
  }
  start = string;
  start = strtok(start, " ");
  while (start != NULL) {
    printf("%s\n", start);
    start = strtok(NULL, " ");
  }
  return 0;
}

註解在哪裡?

這個程式的輸出是 6, 因為有的註解會偽裝.

#include <stdio.h>

int division(int *a, int *b)
{
  return *a/*b /* a simple division */;
}
int main()
{
  int a = 6;
  int b = 2;
  int *aptr = &a;
  int *bptr = &b;
  printf("%d\n", division(aptr, bptr));
}

感謝某位靈的助教提供.

2010年12月19日 星期日

唯讀記憶體的悲哀

有一個字串長這樣 char *string = "this is a string";
想使用 strtok 將它切成一段一段, 結果程式就當掉了.
這就是唯讀記憶體的悲哀...

counter 加一

void foo(int *counter)
{
  *counter = 0;
  ...
  *counter++; 
}

counter 是傳進來的計數器指標, 於是就有強者這樣寫, 然後就死掉了.

2010年12月18日 星期六