字符串的输入输出及相关函数
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);
字符串 相关文章:
- 字符串常量的定义与引用(08-14)