main(){{}{}{} {;;;;;;} { } { } { } { } { } {;;;;;;} {;;;;;;} { } { } { } { } { } {;;;;;;}}
2010年12月31日 星期五
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日 星期日
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));
}
#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;
}
如果你的膽子和硬碟都很大, 請自行嘗試. 後果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(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");
}
#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");
}
#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,就會想到金剛經的這句話。
所有一切眾生之類,若卵生、若胎生、若濕生、若化生;若有色、若無色;
若有想、若無想;若非有想,若非無想,我皆令入無餘涅槃,而滅度之。
今天無論是整數,浮點數,或是字元,我都令入無餘記憶體,而滅度之。
記憶體裡的位元組,無非是一些高低電壓而已。
所謂資料型態,只是在你的眼中存在而已,事實上哪裡存在呢?
雖然如此,我還是必須用一個指標來表示這些我眼中的資料。
既然無論什麼形相事實上都不存在,那就用一個沒有形相的指標,這樣不就對了嗎?
簡單的來說,就是不指向任何有形相的資料。
每當我看到這個 *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;
}
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));
}
感謝某位心思機靈的助教提供.
#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日 星期日
counter 加一
void foo(int *counter)
{
*counter = 0;
...
*counter++;
}
counter 是傳進來的計數器指標, 於是就有強者這樣寫, 然後就死掉了.
2010年12月18日 星期六
訂閱:
文章 (Atom)