Rotating Sentences

来源:互联网 发布:嵌入式linux面试题 编辑:程序博客网 时间:2024/05/01 06:29

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=431

fgets()函数的用法:
函数原型:char *fgets(char *buf, int bufsize, FILE *stream);
参数:
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明buf指向的字符数组的大小。
*stream: 文件结构体指针,将要读取的文件流。
功能:
从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

与gets相比使用这个好处是:读取指定大小的数据,避免gets函数从stdin接收字符串而不检查它所复制的缓存的容积导致的缓存溢出问题

在读取过程中,发生以下三种情况时,读取停止:
1. 发现换行符
2. 发现文件终结符EOF
3. 发生错误
而这个函数在什么情况下会返回NULL呢,就是上述的第2和第3种情况发生时,会返回NULL,此时循环退出。

例:
如果一个文件的当前位置的文本如下
Love, I Have
Since you can do it.
如果用fgets(str1,6,file1);去读取
则执行后str1 = "Love," ,读取了6-1=5个字符
这个时候再执行fgets(str1,20,file1)则执行后str1 = " I Have\n"
而如果
fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的'\n',并自动加上字符串结束符'\0'),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。

fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。
函数原型是:char *fgets(char *s, int n, FILE *stream);

 

#include<stdio.h>#include<string.h>#define N 105char str[N][N];int main(){    int j,k,i,max;    memset(str,' ',sizeof(str));    for(i=max=0;fgets(str[i],N,stdin);i++)    {        if(strlen(str[i])>max)            max=strlen(str[i]);    }             for(k=0;k<max-1;k++)           {                for(j=i-1;j>=0;j--)                  str[j][k] != '\n' && str[j][k] ? putchar(str[j][k]) : putchar(' ');//空格也占位                printf("\n");           }    return 0;}


 

原创粉丝点击