当前位置:编程学习 > C/C++ >>

用C语言实现文章的倒序输出

要求:函数ReadDat()实现从数据文件in.dat中读取一篇英文文章存入到字符串数组xx中。请编写函数StrOL(),其功能是:以读入文章的行为单位,以空格或标点符号(数据文件中仅含含“,”或“。”作为标点符号)作为分隔符,对行中所有单词进行倒排,单词间必须以空格为分割符,之后把已处理的字符串(分隔符只包含空格)按行重新存入字符串数组xx中。最后main函数调用函数WriteDat()把结果xx输出到文件out.dat中。例如:I am a student.I like study,处理后:study like I student a am I
程序如下:#include <stdio.h>#include <string.h>#include <ctype.h>char xx[50][80];int maxline=0;  /* 文章的总行数 */
int ReadDat(void);void WriteDat(void);
void StrOL(void){
}
void main(){    if(ReadDat()){        printf("数据文件IN.DAT不能打开!\n\007");        return;    }    StrOL();    WriteDat();}
int ReadDat(void){    FILE *fp;    int i=0;    char *p;    if((fp=fopen("in.dat","r"))==NULL) return 1;    while(fgets(xx[i],80,fp)!=NULL){        p=strchr(xx[i],'\n');        if(p) *p=0;        i++;    }    maxline=i;    fclose(fp);    return 0;}
void WriteDat(void){    FILE *fp;    int i;    fp=fopen("out.dat","w");    for(i=0;i<maxline;i++){        printf("%s\n",xx[i]);        fprintf(fp,"%s\n",xx[i]);    }    fclose(fp);}主要是我找不到一个简单的算法,我想到的都太过复杂,所以只好来这里求助高手啦
追问:不好意思,你是怎么测试你的程序的呢?我试试,没有任何输出
答案:粗一看题目 以为很容易 结果 代码+调试用了1个小时 

void StrOL(void)
{
 char tempstr[80][10] = {0};
 int n=0,m=0,i=0,j=0;       // 在第一段循环中n保存的是tempstr的最大行数
 // 以每个单词为一行copy到tempstr中
 for(i=0; i != maxline; ++i)
  for (j = 0 ; xx[i][j] ; ++j)
  {
   // 判断可以使用库函数替代
   if (xx[i][j] == ' ' || xx[i][j] == ',' || xx[i][j] == '.' || xx[i][j] == '!') // 是符号或空格就另存一行
   {
    tempstr[n][m] = '\0';    // 要换行 在未换前先加个结束符
    ++n;
    m=0;
    tempstr[n][m++] = xx[i][j];   // 符号copy
    tempstr[n][m] = '\0';    // 要换行 在未换前先加个结束符
    ++n;
    m=0;
   }
   else
    tempstr[n][m++] = xx[i][j];
  }
 for (i= 0 ; i != maxline ; ++i)
 {
  xx[i][0] = '\0';       // 清除原来xx数组中的数据
 }
 // 以行为逻辑思维 自底向上复制到xx中
 for (i=0,j=0;n >= 0 ; --n)
 {
  int wordlen = strlen(tempstr[n]);   // 计算单词或符号的长度
  if (j + wordlen >= 80)      // 超出xx每行的容量就换行 并且结尾加结束符
  {
   ++i;
   xx[i][j+1] = '\0';
   j=0;
  }
  strcat(&xx[i][j],tempstr[n]);    // 连接单词或符号
  j += wordlen;        // 计算单词或符号的长度 重新定位连接位置
 }
}

那我不给代码了,说下我的意见。既然是倒序,那么就不论一个单词还是整个文章了。设置一个缓冲区,一次读取所有内容〔空间换时间〕,然后用一个指针逆序扫描文件并输出……

上一个:计算机二级C语言都考些什么?
下一个:学习c语言的好方法是什么啊?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,