程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> read()讀取文本字節導致判斷失誤的問題,read文本

read()讀取文本字節導致判斷失誤的問題,read文本

編輯:關於C語言

read()讀取文本字節導致判斷失誤的問題,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 }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved