工作了幾個月,閒著沒事又拿起了經典的C程序設計看了起來,看到字符計數一節時想到用read()去讀文本作為字符輸入,一切OK,直到行計數時問題出現 了,字符總計數沒有問題,可行計算就是進行不了,思考了半天又找“大神”幫忙終於找到問題所在了,問題就出在條件判斷的char與int的比較上:
問題的關鍵就在於read()的讀取為直接寫內存塊,當讀取一個字節時僅僅把讀取到的一個字節寫到內存的一個字節的地址上去,當用int類型讀取出來時,結果int的前三個字節還是處於垃圾數據的狀態,將其與' '一個字節比較,必然出現不相等的情況,解決的辦法為在開始即將int c初始化為0,或者將int 強制轉化為char 類型,避免前三個垃圾數據加入比較中。
總結就是,一個好習慣真的很重要,一定要記得初始化。
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <fcntl.h> 5 6 int main(int argc, char **argv) 7 { 8 int fd; 9 long nc = 0; 10 long lc = 0; 11 long tc = 0; 12 13 int c; 14 int ret; 15 16 printf("c = %c ,%08x %d %c\n", c,c,c,(char)(c)); 17 fd = open(argv[1], O_RDONLY); 18 19 while ((ret = read(fd, &c, 1)) != 0) { 20 printf("c = %c ,0x_c = %08x d = %d c_char = %c\n", c, c, c, (char)(c)); 21 nc++; 22 if (c == ' ') { 23 lc++; 24 } else if (c == '\t') { 25 tc++; 26 } 27 } 28 29 printf("char count: %ld\n", nc); 30 printf("line count: %ld\n", lc); 31 printf("table count: %ld\n", tc); 32 33 close(fd); 34 35 return 0; 36 }