ctype.h中的函数是用来分析字符。常用方法如下:
tolower():返回参数的小写形式。如果本身是小写,就直接返回该小写字符。
toupper():返回参数的大写形式。
isdigit():是否是阿拉伯数字。
isalpha():是否是字母。
isblank():是否是空格或者水平制表符。
isspace():是否是空字符(包含空格,水平制表符,换行,垂直制表符等)。
islower():是否是小写字母。
isupper():是否是大写字母。
isxdigit():是否是十六进制数字字符。
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,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。
用户输入的每一行文字中,只获取第一个,将第二个及以后所有的字符都忽略。如下:
int c; while ((c = getchar()) != EOF) { putchar(c); while(getchar() !='\n'){//非换行符直接忽略。 continue; } //上面循环结束的时候,getchar()读取的是换行符,所以在外层while()中读取的是下一行的第一个字符。 printf('\n'); }
gets()从标准输入设备中读取一个字符串,读到换行符时产生一个字符串:读取换行符之前所有的字符(不包括换行符,会读取换行符,但将换行符舍弃),并加上'\0'字符,从而产生字符串。
它使用一个地址做为参数。并且返回值为char*,其值代表着读取到的字符串的首地址,因此返回的指针与传递给它的是同一个指针。输入的字符串只有一个备份,它放在作为参数传递过来的地址中。
正确读取到字符串时,返回读入的字符串的地址;出错或gets()遇到文件结尾,则返回NULL。因此在读入时需要进行判断:
while(gets(name)!=NULL)
这样的指令既可以判断是否读到文件的结尾,又可以读取一个值。如果是结尾的话,name中什么也不会存储。
gets()不会检查预留存储区是否足够存储读取到的字符串,它会将多余的字符填充到相邻的内存区。fgets()改进了此问题,它可以指定最大的读入字符数。
1,第二个参数用于指定最大读入字符数。如果这个参数为n,那么最多读取n-1个字符或者读完一个换行符为止。两者中最先满足的那个来结束读入。
2,fgets()读到换行符时,会存储换行符,而不像gets()那样将换行符丢弃。
3,第三个参数用于指定读取哪一个文件。从键盘上读取的时候,可以使用stdin(stdio.h中定义的)作为该参数。
由于gets()读取字符串的时候不检查预留内存的大小是否够用,所以可以通过输入大量字符来覆盖掉原本内存区域中的数据,这很不安全。因此,应该使用fgets()代替gets()。
使用格式符%s时,scanf()一样可以读取字符串,但它读取的是单词,而fgets()与gets()读取的是整个字符串——可能包含若干个单词。
scanf()会从第一个非空白字符开始,直到下一个空白字符结束,即一个单词。如果指定了读取的字段宽度,如%10s,那么scanf()会读取10个字符或者遇到空白符。如果一个单词未被读完,则余下的部分就会留到下一个scanf()时读取。
总结:使用gets()和fgets()从键盘中读取文本,而scanf()主要用于以某种标准形式输入的混合类型数据的读取和转换。
与gets()相反,用于输出一个字符串,puts()在输出字符串时会自动在字符串后面加上换行键。
是puts()函数面向文件的版本,它与puts()的主要区别为:
1,需要第二个参数来指明输出到的文件,使用stdout作为参数来进行输出显示。
2,fputs()不会自动添加换行符。
总之:gets()丢弃换行符,而puts()输出添加换行符;fgets()存储换行符,而fputs()不为输出添加换行符。当然也可以自定义输出,比如使用putchar()输出一个最后不带换行符的puts():
while(*str){//const char* str; putchar(*str++); }
因为只用于输出,所以需要使用const进行修饰。++优先级比*高,所以*str++的作用是先将*str输出,再对str++,并不是将(*str)++。字符串结束符为'\0',*str为0,这样就结束了循环,因此不需要写*str!='\0'。
将格式化后的数据写入到某个缓冲区中,类似于java中直接使用+将字符串与非字符串结合成字符串。如:
sprintf(r,"%s+%d","p",1);//p+1
与getchar(),putchar()类似,但需要指定它们要使用的文件。如getc(stdin)就与getchar的作用一样,putc(c,stdout)与putchar(c)的作用一样。
而且,一般情况下getchar()与putchar()都是通过getc()与putc()定义的。
getchar与putchar():读取(输出)单个字符,含空格。
getc()与putc():getchar与putchar()的升级版,可以读取或输出到指定的流中。
gets()与puts():读取或输出一个字符串。
fgets()与fputs():读取或输出一个字符串,但能指定读取或输出来源。一般面积于文件。
printf()与scanf():用来进行格式化输出与输入,输出到stdout中,从stdin中输入。
sprintf()与sscanf():与printf(),scanf()类似,只是需要一个做为输出输入的字符串。前者将格式化后的数据输出到第一个参数中,后者从第一个参数中读取指定格式的数据。如
char* s = malloc(10); sscanf("2v a34", "%s",s); puts(s);//输出:2vfprintf()与fscanf():与printf()和scanf()类似,但需要指定一个FILE*参数,用于表示将格式化后的数据输出到什么地方,或者从什么地方读取数据。
scanf()在读取数字时,会以空格为分隔符,而printf()在输出时以字符串的结尾字符做为结束符。如使用scanf()与printf()读取输出"va reqwr",那么scanf()会读成两个字符串:"va"与"reqwr",但printf()输出时仍旧是一个。
在程序运行时分配更多的内存,它接受一个参数:所需要的内存字节数。malloc()分配了内存,但没有为内存指定名字,只是将内存的第一个字节的地址返回,一般会将malloc的返回值进行强转,强转成自己需要的类型。
如果malloc()找不到所需要的内存,它将返回一个空指针。如果找到,就返回一个void类型指针(即void*)。
void指针值赋值给其他类型的指针并不构成类型冲突,因此void类型的指针称为“通用指针”。如
double* ptd = (double*)malloc(20*sizeof(double));
将返回的void*直接强转成double*,因为void*是通用指针,所以不会构成类型冲突。该代码是请求30个double类型值的空间。
两者都可以用来创建一个大小在运行时决定的数组。
但变长数组是自动存储的,它所用的内存空间在代码块运行完定义部分之后自动释放。
而malloc()创建的数组不必局限在一个函数中,例如可以返回一个该数组的指针,供调用该函数的函数进行访问。接着,调用函数在结束时调用free()进行释放。
每个malloc()的调用,都需要调用free()来释放刚才分配的内存。函数free()的参数是先前malloc()返回的地址。这样,分配的内存的持续时间从malloc()开始,到调用free()结束。
注意:free()不能释放通过其他方式分配的内存——如通过数组形式声明一个数组获得的内存不能使用free()进行释放。
与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*。
关闭所有打开的文件并终止程序,在任何函数中调用exit()都会终止程序。另外,它通常的参数值为EXIT_SUCCESS和EXIT_FAILURE,前者表示成功终止,后者表示非成功终止。