微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 字符串的输入输出及相关函数

字符串的输入输出及相关函数

时间:08-14 来源:ZLG致远电子 点击:

 

printf()函数

 

转换格式符s%允许printf()写字符串,与puts不同的是,printf()不会自动地在每个字符串的末尾加上一个换行符,因此必须在参数中指明应该在哪里使用换行符。比如:

char str[] = "hello world"; 

printf("%s\n", str);

 

printf()会逐个写字符串中的字符,直到遇到空字符为止。如果只想显示字符串的一部分,可以使用转换格式符%.ps,这里的p是显示的字符数量。比如,显示hello:

printf("%.5s\n", str);

 

puts()函数

 

虽然printf()用起来比较复杂,但可以打印多个字符串。除了printf(),C标准库还提供了puts(),其函数原型如下:

int puts(const char *s); 

 

其中,s为指定输出的字符串,puts()函数将参数s指向的字符串输出到标准输出设备中,但不输出结束符'\0'。在输出字符串后,puts()函数会多输出一个换行符'\n',然后通过标准输出设备显示指定的字符串。如果显示成功,则返回0,否则返回预定义常量EOF。puts()如何知道在何处停止呢?该函数在遇到空字符时就停止输出,所以必须确保有空字符。

 

(3)fgets()函数和fputs()函数

 

fgets()函数

 

fgets()和fputs()分别是gets()和puts()针对文件的定制的版本,fgets()通过第2个参数限制读入的字符数来解决溢出的问题,该函数专门用于处理文件输入。如果第2个参数的值是n,那么fgets()将读入n-1个字符,或遇到第1个换行符为止。如果读到一个换行符将它存储在字符串中,这点与gets()不同,gets()会丢弃换行符。

 

fgets()的第1个参数与gets()一样,也是存储输入位置的地址(char *类型),第2个参数是一个整数,表示待输入字符串的大小,最后一个参数是文件指针,指定待读取文件。如果读入从键盘输入的数据,则以标准输入stdin作为参数,该标识定义在stdio.h中。其调用示例如下:

fgets(buf, STLEN, fp); 

 

其中,buf是char类型数组的名称,STLEN是字符串的大小,fp是指向FILE的指针。以上面的gets()为例,fgets()读取输入直到第1个换行符的后面,或读到文件结尾,或读取STLEN-1个字符,然后fgets()在末尾添加一个空字符使之成为一个字符串,字符串的大小是其字符数加上一个空字符。如果fgets()在读到字符上限之前已经读完一整行,它会将表示行结尾的换行符放在空字符前面。fegts()在遇到EOF时将返回NULL,因此可以利用这一机制检查是否到达文件结尾。如果未遇到EOF,则返回它的地址。

 

fgets()存储换行符有好处也有坏处,坏处是你可能不想将换行符存储在字符串中,这样的换行符会带来一些麻烦。好处是对于存储的字符串而言,检查末尾是否有换行符可以判断是否读取了一整行。如果不是一整行,则要妥善处理一行中剩下的字符。

 

首先,如何处理换行符?一个方法是在已经存储的字符串中查找换行符,并将其替换成空字符。假设\n在st中:

while(st[i] != '\n' )

       i++;

       st[i] = '\0'; 

 

其次,如果仍有字符串留在输入行怎么办?一个可行的办法是,如果目标数组装不下一整行输入,就丢弃那些多出的字符。即读取但不存储输入,包括\n:

while(getchar() != '\0') 

       continue;

 

为何要丢弃输入行中余下的字符?因为输入行中多出来的字符会留在缓冲区中,成为下一次读取语句的输入。比如,如果下一条读取语句要读取的是double类型的值,就可能导致程序崩溃,而丢弃输入行余下的字符是为了保证读取语句与键盘输入同步。既然没有这样的函数,那么就创建一个,s_gets()函数详见程序清单 1.41。

 

程序清单 1.41  s_gets()函数

1     char * s_gets(char *st, int n) 

2     { 

3            char *ret_value; 

4            int i = 0; 

5

6            ret_value = fgets(st, n, stdin); 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top