ctype,sdtio与stdlib

ctype

        ctype.h中的函数是用来分析字符。常用方法如下:

        tolower():返回参数的小写形式。如果本身是小写,就直接返回该小写字符。

        toupper():返回参数的大写形式。

        isdigit():是否是阿拉伯数字。

        isalpha():是否是字母。

         isalnum() :是否是字母或数字。也就是说isdigit()或者isalpha()返回true,该函数返回true;否则返回false。

        isblank():是否是空格或者水平制表符

        isspace():是否是空字符(包含空格,水平制表符,换行,垂直制表符等)。

        islower():是否是小写字母。

        isupper():是否是大写字母。

        isxdigit():是否是十六进制数字字符。

stdio

       io与Java中含义一样,都是表示in/out流。从概念上说,c对文件的处理都是处理基本的流,而不是直接处理文件。于是打开文件的过程就成为了将流与这个文件进行关联,并通过流进行读写的过程。特别是键盘,显示设备作为每一个c程序自动打开的文件来对待,键盘输入由一个被称为stdin的流表示,到屏幕上的输出由一个stdout的流表示。getchar(),putchar(),printf()与scanf()函数都是标准的I/O包成员,这两个函数都是同这个两个流打交道。所以可以使用与处理文件相同的技术来处理键盘输入,输出。

文件结尾

        不同系统对文件结尾有不同的表示方法,但C屏蔽了这些差异,在读到文件结尾之时会返回一个EOF(end of file,在stdio.h中定义)。因此只需要比对读取到的值与EOF是否相等即可。如:while ((c = getchar()) != EOF),其中c是int类型的。

        将c声明成int类型而不是char的原因:由于char变量的范围是0-255中的无符号整数来表示,而EOF可能取到-1,所以char类型的变量读取不到EOF的值,而int类型的变量却是可能的。并且getchar()返回的也是int类型的,所以最好使用int类型而不是使用char类型

重定向

        默认情况下,stdin与stdout对应的是键盘与屏幕。而重定向就是将这两个流指向别的位置(比如一个文件等),从而实现对文件的读写——这是文件读写的一个方式,另外c提供了专门用来操作文件的函数。

        注意:C中用ctrl+Z模拟EOF。

        <:将指定的文件当作stdin

        >:将指定的文件当作stdout

如下:


重定向具有以下规则:

        1,重定向将一个可执行程序与一个数据文件相连,不能将一个数据文件与另一个数据文件,一个可执行程序与另一个可执行程序相连。

        2,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。

跳过一行其它文件

        用户输入的每一行文字中,只获取第一个,将第二个及以后所有的字符都忽略。如下:

[cpp]  view plain  copy
 
  1. int c;  
  2. while ((c = getchar()) != EOF) {  
  3.     putchar(c);  
  4.     while(getchar() !='\n'){//非换行符直接忽略。  
  5.         continue;  
  6.     }  
  7.     //上面循环结束的时候,getchar()读取的是换行符,所以在外层while()中读取的是下一行的第一个字符。  
  8.     printf('\n');  
  9. }  

gets()

        gets()从标准输入设备中读取一个字符串,读到换行符时产生一个字符串:读取换行符之前所有的字符(不包括换行符,会读取换行符,但将换行符舍弃),并加上'\0'字符,从而产生字符串。

        它使用一个地址做为参数。并且返回值为char*,其值代表着读取到的字符串的首地址,因此返回的指针与传递给它的是同一个指针。输入的字符串只有一个备份,它放在作为参数传递过来的地址中。

        正确读取到字符串时,返回读入的字符串的地址;出错或gets()遇到文件结尾,则返回NULL。因此在读入时需要进行判断:

while(gets(name)!=NULL)

        这样的指令既可以判断是否读到文件的结尾,又可以读取一个值。如果是结尾的话,name中什么也不会存储。

fgets()

        gets()不会检查预留存储区是否足够存储读取到的字符串,它会将多余的字符填充到相邻的内存区。fgets()改进了此问题,它可以指定最大的读入字符数。

        1,第二个参数用于指定最大读入字符数。如果这个参数为n,那么最多读取n-1个字符或者读完一个换行符为止。两者中最先满足的那个来结束读入。

        2,fgets()读到换行符时,会存储换行符,而不像gets()那样将换行符丢弃。

        3,第三个参数用于指定读取哪一个文件。从键盘上读取的时候,可以使用stdin(stdio.h中定义的)作为该参数。

       由于gets()读取字符串的时候不检查预留内存的大小是否够用,所以可以通过输入大量字符来覆盖掉原本内存区域中的数据,这很不安全。因此,应该使用fgets()代替gets()。

scanf()

        使用格式符%s时,scanf()一样可以读取字符串,但它读取的是单词,而fgets()与gets()读取的是整个字符串——可能包含若干个单词。

        scanf()会从第一个非空白字符开始,直到下一个空白字符结束,即一个单词。如果指定了读取的字段宽度,如%10s,那么scanf()会读取10个字符或者遇到空白符。如果一个单词未被读完,则余下的部分就会留到下一个scanf()时读取。

        总结:使用gets()和fgets()从键盘中读取文本,而scanf()主要用于以某种标准形式输入的混合类型数据的读取和转换。

puts()

        与gets()相反,用于输出一个字符串,puts()在输出字符串时会自动在字符串后面加上换行键。

fputs()

        是puts()函数面向文件的版本,它与puts()的主要区别为:

        1,需要第二个参数来指明输出到的文件,使用stdout作为参数来进行输出显示。

        2,fputs()不会自动添加换行符。

        总之:gets()丢弃换行符,而puts()输出添加换行符;fgets()存储换行符,而fputs()不为输出添加换行符。当然也可以自定义输出,比如使用putchar()输出一个最后不带换行符的puts():

[cpp]  view plain  copy
 
  1. while(*str){//const char* str;  
  2.     putchar(*str++);  
  3. }  

        因为只用于输出,所以需要使用const进行修饰。++优先级比*高,所以*str++的作用是先将*str输出,再对str++,并不是将(*str)++。字符串结束符为'\0',*str为0,这样就结束了循环,因此不需要写*str!='\0'。

sprintf()

        将格式化后的数据写入到某个缓冲区中,类似于java中直接使用+将字符串与非字符串结合成字符串。如:

[cpp]  view plain  copy
 
  1. sprintf(r,"%s+%d","p",1);//p+1  

getc()与putc()

        与getchar(),putchar()类似,但需要指定它们要使用的文件。如getc(stdin)就与getchar的作用一样,putc(c,stdout)与putchar(c)的作用一样。

        而且,一般情况下getchar()与putchar()都是通过getc()与putc()定义的。

getter与setter的总结       

        getchar与putchar():读取(输出)单个字符,含空格。

        getc()与putc():getchar与putchar()的升级版,可以读取或输出到指定的流中。

        gets()与puts():读取或输出一个字符串。

        fgets()与fputs():读取或输出一个字符串,但能指定读取或输出来源。一般面积于文件。

printf()与scanf()总结

        printf()与scanf():用来进行格式化输出与输入,输出到stdout中,从stdin中输入。

        sprintf()与sscanf():与printf(),scanf()类似,只是需要一个做为输出输入的字符串。前者将格式化后的数据输出到第一个参数中,后者从第一个参数中读取指定格式的数据。如

[cpp]  view plain  copy
 
  1. char* s = malloc(10);  
  2. sscanf("2v a34""%s",s);  
  3. puts(s);//输出:2v  
        fprintf()与fscanf():与printf()和scanf()类似,但需要指定一个FILE*参数,用于表示将格式化后的数据输出到什么地方,或者从什么地方读取数据。

        scanf()在读取数字时,会以空格为分隔符,而printf()在输出时以字符串的结尾字符做为结束符。如使用scanf()与printf()读取输出"va  reqwr",那么scanf()会读成两个字符串:"va"与"reqwr",但printf()输出时仍旧是一个。

malloc()

        在程序运行时分配更多的内存,它接受一个参数:所需要的内存字节数。malloc()分配了内存,但没有为内存指定名字,只是将内存的第一个字节的地址返回,一般会将malloc的返回值进行强转,强转成自己需要的类型

        如果malloc()找不到所需要的内存,它将返回一个空指针。如果找到,就返回一个void类型指针(即void*)。

        void指针值赋值给其他类型的指针并不构成类型冲突,因此void类型的指针称为“通用指针”。如

[cpp]  view plain  copy
 
  1. double* ptd = (double*)malloc(20*sizeof(double));  

        将返回的void*直接强转成double*,因为void*是通用指针,所以不会构成类型冲突。该代码是请求30个double类型值的空间。

malloc()与变长数组

        两者都可以用来创建一个大小在运行时决定的数组。

        但变长数组是自动存储的,它所用的内存空间在代码块运行完定义部分之后自动释放。

        而malloc()创建的数组不必局限在一个函数中,例如可以返回一个该数组的指针,供调用该函数的函数进行访问。接着,调用函数在结束时调用free()进行释放。

free()

        每个malloc()的调用,都需要调用free()来释放刚才分配的内存。函数free()的参数是先前malloc()返回的地址。这样,分配的内存的持续时间从malloc()开始,到调用free()结束。

        注意:free()不能释放通过其他方式分配的内存——如通过数组形式声明一个数组获得的内存不能使用free()进行释放。

calloc()

        与malloc()类似,也是用于动态分配内存,也可以使用free()进行释放。但它将内存块中的全部位置都置为0。

输入总结

        scanf():以指定格式的数据读取,可以读取int等类型的值。在读取非字符类型数据时,以空白符作为分隔符;读取字符时,会按顺序一个个的读取,包括空白符

        sscanf():与scanf()类似,但可以指定输入源——第一个参数指定的字符串。

        fscanf():与scanf()类似,但可以指定输入源——第一个参数指定的FILE*指针。

        gets():读取字符串,以回车做为分隔符,同时不存储末尾的换行符,即一次可以读完完整的一行。

        fgets():读取字符串,但可以指定输入源(通常是某个文件),最大读取的字符个数,同时存储末尾换行符。

        getchar():读取字符,与以%c模式使用scanf()时效果相同。

        getc():与getchar()类似,但可以指定输入源,通常用来从文件中读取字符。

输出总结

        printf():格式化输出到stdout中。

        sprintf():格式化输出到第一个参数指定的char*中。

        fprintf():格式化输出到第一个参数指定的FILE*中。

        puts():输出字符串,并自动加上换行符。

        fputs():输出第二个参数指定的FILE*中。

        putchar():将一个字符输出到stdout上。

        putc():将一个字符输出到第二个参数指定的FILE*。

stdlib

exit()

        关闭所有打开的文件并终止程序,在任何函数中调用exit()都会终止程序。另外,它通常的参数值为EXIT_SUCCESS和EXIT_FAILURE,前者表示成功终止,后者表示非成功终止。

atexit()

        指定执行exit()时调用的函数,其参数为函数指针。atexit()会将其参数注册到调用exit()时执行的函数列表中(该列表至少会存储32个函数)。该列表按照先进后出的顺序执行这些函数。并且做为atexit()参数的函数都必须是无参数的void函数。
[cpp]  view plain  copy
 
  1. void exitAt();  
  2. int main(int argc, const char * argv[]) {  
  3.     atexit(exitAt);//函数名就是函数的地址  
  4.     return 0;  
  5. }  
  6. void exitAt(){  
  7.     printf("exit exit");  
  8. }  
       在调用exit()时,会先将atexit()注册的函数执行完毕后才做一些自身的清理工作,才正式退出程序。

qsort

        快速排序。
        第一个参数为要排序的数组的首地址,第二个参数为数组的大小,第三个参数为数组中每一个元素的大小,第四个参数为函数指针,用于指定排序时对两个元素进行比较的函数。该函数有两个要求:返回值为int,两个参数为const void*类型。如下:
[cpp]  view plain  copy
 
  1. int exitAt(const void*,const void*);  
  2. int main(int argc, const char * argv[]) {  
  3.     int a[] = {4,6,2,8,7};  
  4.     qsort(a, 5, sizeof(int), exitAt);  
  5.     printf("[2] = %d\n",a[2]);  
  6.     return 0;  
  7. }  
  8. //返回值为int,两个参数为void*。使用时先将void*转为数组元素类型的指针。  
  9. int exitAt(const void* arg1,const void* arg2){  
  10.     return *((int*)arg1) - *((int*)arg2);  
  11. }  

你可能感兴趣的:(ctype,sdtio与stdlib)