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


  工作了幾個月,閑着沒事又拿起了經典的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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM