C語言基礎 - read()函數讀取文本字節致使判斷失誤的問題

  工做了幾個月,閒着沒事又拿起了經典的C程序設計看了起來,看到字符計數一節時想到用read()去讀文本做爲字符輸入,一切OK,直到行計數時問題出現 了,字符總計數沒有問題,可行計算就是進行不了,思考了半天又找「大神」幫忙終於找到問題所在了,問題就出在條件判斷的char與int的比較上:c++

  問題的關鍵就在於read()的讀取爲直接寫內存塊,當讀取一個字節時僅僅把讀取到的一個字節寫到內存的一個字節的地址上去,當用int類型讀取出來時,結果int的前三個字節仍是處於垃圾數據的狀態,將其與' '一個字節比較,必然出現不相等的狀況,解決的辦法爲在開始即將int c初始化爲0,或者將int 強制轉化爲char 類型,避免前三個垃圾數據加入比較中。spa

  總結就是,一個好習慣真的很重要,必定要記得初始化。設計

 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 }
相關文章
相關標籤/搜索