2015-01-14 28 views
0

在這個程序中,我需要存儲我在一個數組中讀取的ascii字符的頻率(以便打印最頻繁的)。問題是,我從讀取得到的不是ascii(最可能是某種地址),所以在buf []數組中,我越界了。 有人可以幫助我嗎?我如何從閱讀中獲取ascii字符?

#include <sys/types.h> 
    #include <sys/stat.h> 
    #include <fcntl.h> 
    #include <stdio.h> 
    #include<stdlib.h> 
    #include<unistd.h> 
    #include<strings.h> 

    #define MODEMDEVICE "/dev/ttyAMA0" 

    #define FALSE 0 
    #define TRUE 1 

    volatile int STOP=FALSE; 

    int main() 
    { 
     int fd,c, res=0,i; 
     struct termios oldtio,newtio; 
     int buf[128] ; 

     for (i=0;i<128;i++) buf[i]=0; 

     fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); 
     if (fd <0) {perror(MODEMDEVICE); exit(-1); } 

     tcflush(fd, TCIFLUSH); 
     while (STOP==FALSE) {  /* loop until we have a terminating condition */ 
      int r=read(fd,&c,1); 
      write(1,&c,1); 
      if (c=='\n') { 
        for(i=0;i<128;i++) 
         if (res < buf[i]) 
          res = buf[i]; 
        printf("first char %d \n", res); 
      } 
      else { 
        buf[c]++; 

      } 
     } 
    } 
+0

你爲什麼這樣做'INT S = C;'? –

+0

對不起,我正在試驗,我有點忘了它。它絕對沒有理由在那裏。 thnx注意。 – petyhaker

+0

請不要使用這樣的線索折磨讀者,它們不會使代碼更具修飾性,特別不可讀,並且使用更多的空格,編譯器會忽略它們。 –

回答

2

int c創建一個大概4個字節的變量。它沒有初始化,因此它可能包含任何垃圾。

然後系統調用

read(fd,&c,1) 

改變這些字節的一個,可能是最高或最低,而不影響其他不變。現在你有3個字節的隨機垃圾加上從fd新鮮的一個字節的組合,放在c的某處。

然後您嘗試從該組合中獲得感覺。

事情可能工作得更好,如果你定義C作爲char

char c; 
+0

而且,請檢查'r'的值,如果它是'0'或'-1'則必須格外小心。 –

+0

謝謝你們,你們非常樂於助人! – petyhaker