我如何从阅读中获得ascii字符?

时间:2015-01-14 20:21:47

标签: c ascii memory-address

在这个程序中,我需要存储我在数组中读取的ascii字符的频率(为了打印最频繁的)。问题是我从read中得到的不是ascii(很可能是某种地址)所以在buf []数组中我越界了。 任何人都可以告诉我这个吗?

    #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]++;

            }
        }
    }

1 个答案:

答案 0 :(得分:2)

int c创建一个大约4个字节的变量。它没有初始化,因此它可能包含任何垃圾。

然后系统调用

read(fd,&c,1)

更改其中一个字节,可能是最高或最低,而其他字节保持不变。现在你有3个字节的随机垃圾加上fd新鲜的一个字节,放在c的某个地方。

然后你试着理解这个组合。

如果将c定义为char

,事情可能会好得多
char c;