以下代码在Federo9上试验成功。
一、格式化输入16进制字符串
printf("Format:%.2x ",10);
输入结果:
二、测试各类型的占用的字节数
int main(int argc, char *argv[]) { int OutputHex = 1; unsigned char aValue=10; char Buffer[10]; int len=sprintf(Buffer, OutputHex ? "%.2X " : "%c", aValue); printf("Len:%d Format:%s ",len,Buffer); printf("Size Of char:%d ",sizeof(char)); printf("Size Of unsigned char:%d ",sizeof(unsigned char)); printf("Size Of int:%d ",sizeof(int)); return EXIT_SUCCESS; }
输入结果:
三、使用getopt函数来获取参数
当我们运行Linux下的C语言程序的时候,就可以非常方便地用getopt()这个函数将main参数中的argv提取出来,按需进行处理。函数的使用见以下代码段。
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { int opt; while((opt = getopt(argc, argv, ":if:lr")) != -1) { switch(opt) { case 'i': case 'l': case 'r': printf("option: %c ", opt); break; case 'f': printf("filename: %s ", optarg); break; case ':': printf("option needs a value "); break; case '?': printf("unknown option: %c ", optopt); break; } } for(; optind < argc; optind++) printf("argument: %s ", argv[optind]); exit(0); }
四、exit()和_exit()函数
1、_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。
2、exit中的参数exit_code为0代表进程正常终止,若为其他值表示程序执行过程中有错误发生。
五、用fprintf实现printf
大家可以通过以下代码看看两者的异同。
#include <stdio.h> int main(void){ printf("Hello world using printf "); fprintf(stdout, "Hello world To stdout "); fprintf(stderr, "Hello world To stderr "); }
stdout和stderr都是打印在屏幕的,因为标准错误输出流对象(stderr)就是定义为屏幕
输出结果:
小记:
关于 stdin、stdout、stderr 的说明如下:
stdout(Standard Output Stream)标准输出
stdin(Standard Input Stream)标准输入
stderr(Standard Error Output)标准错误输出
默认情况下,标准输入(stdin)指的从键盘上读数据,而标准输出(stdout)和标准错误输出(stderr)是指屏幕
六、捕捉Esc按键
捕捉其他按键的程序跟这个差不多,总的思路就是通过判断键盘扫描码进行对应的处理。
#include <stdio.h> int main ( void ) { unsigned char aValue; printf ( "Enter a Char " ); aValue = getchar(); if ( aValue == 'x1b' ) { printf ( "Esc pressed %c ",aValue ); }else { printf ( "Esc Not pressed%c ",aValue ); } }
结果:
七、避免getchar()读入用于结束输入的换行符
#include <stdio.h> int main ( void ) { unsigned char aValue; do{ printf ( "Enter a Char " ); do{ aValue = getchar(); }while(aValue==' ' );//避免读入 if ( aValue == 'x1b' ) { printf ( "Esc pressed. " ); }else { printf ( "Esc Not pressed. %c Pressed ",aValue ); } }while(aValue!='q' );//读到q的时候,退出 }
八、如果stdout已经被重定向,可以将消息写到stderr(标准错误输出),stderr不会被重定向。
另外,Linux是一个多用户的系统,我们可以通过利用’/dev/tty‘正确地将信息输出到用户正在使用的终端上。
九、fileno()函数
功 能:把文件流指针转换成文件描述符
相关函数:open, fopen
表头文件:#include <stdio.h>
定义函数:int fileno(FILE *stream)
函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词
返回值 :返回和stream文件流对应的文件描述符。如果失败,返回-1。
范例:
#include <stdio.h> main() { FILE *fp; int fd; fp = fopen("/etc/passwd", "r"); fd = fileno(fp); printf("fd = %d ", fd); fclose(fp); }
文件描述词是Linux编程中的一个术语。当一个文件打开后,系统会分配一部分资源来保存该文件的信息,以后对文件的操作就可以直接引用该部分资源了。文件描述词可以认为是该部分资源的一个索引,在打开文件时返回。在使用fcntl函数对文件的一些属性进行设置时就需要一个文件描述词参数。
以前知道,当程序执行时,就已经有三个文件流打开了,它们分别是标准输入stdin,标准输出stdout和标准错误输出stderr。和流式文件相对应的是,也有三个文件描述符被预先打开,它们分别是0,1,2,代表标准输入、标准输出和标准错误输出。
需要指出的是,上面的流式文件输入、输出和文件描述符的输入输出方式不能混用,否则会造成混乱。