Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1951476
  • 博文数量: 261
  • 博客积分: 8073
  • 博客等级: 中将
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-10 15:23
文章分类

全部博文(261)

文章存档

2013年(1)

2012年(1)

2011年(50)

2010年(34)

2009年(4)

2008年(17)

2007年(55)

2006年(99)

分类:

2007-06-07 09:59:49

   昨天写了一个小程序,关于平衡符号的。运行正常,只是每次输出都重复一遍,例如:
   从input.txt文件读入数据{[()]},其实input.txt中只有一行数据
   
{[()]}
,输出本应该是
{[()]} : RIGHT!
但是,真正输出是:
{[()]} : RIGHT!
{[()]} : RIGHT!
几经查找,原来是fscanf和feof的原因.对于一个0字节文件,只有read一次,feof才会认为到达了文件结尾(原以为,对于0字节文件,feof会直接判断出到达了文件结尾)。我先前的程序如下
.......................
while(feof(fp)){
    fscanf(....);
}
.......................
这样造成,即使文件已经到达了文件结尾,但是feof不会返回true,反而继续执行循环,当fscanf被执行后,此时feof才会认为到达了文件结尾(造成多执行一次循环)。所以判断文件结尾应该放在fscanf之后:
.......................
while(1){
    fscanf(....);
    if(feof(fp))
        break;

}




.......................

附上平衡字符的源码:
#include
#include
#include
#include "Stack.h"

#define F_INPUT "input.txt"
#define M_INPUT "r"
#define MAXBUFSIZE 80

int main()
{
        FILE *fp;
        Stack *s;
        char buf[MAXBUFSIZE], c, k;
        int i, flag;
        if((fp = fopen(F_INPUT, M_INPUT)) == NULL){
                printf("Can not open input file\n");
                return 1;
        }
        if( (s = (Stack *)malloc(sizeof(Stack))) == NULL){
                printf("Fail to stack allocation\n");
                return 1;
        }
        initStack(s);
        while(1){
                flag = 0;
                fscanf(fp, "%s", buf);
                if(feof(fp) || ferror(fp))
                        break;
                //printf("%s\n", buf);
                for(i = 0;i < strlen(buf);i++){
                        c = buf[i];
                        if(c == '{' || c == '[' || c == '(')
                                pushStack(s, c);
                        else if(c == '}' || c == ']' || c == ')'){
                                if(emptyStack(s)){
                                       flag = 1;
                                        break;
                                }
                                popStack(s, &k);
                                //printf("k = %c\n", k);
                                if((c == '}' && k == '{') || (c == ']' && k == '[') || (c == ')' || k == '('))
                                        continue;
                                else{
                                        flag = 1;
                                        break;
                                }
                        }
                }
                if(!emptyStack(s))
                        flag = 1;
                if(flag)
                        printf("%s : ERROR!\n", buf);
                else
                        printf("%s : RIGHT!\n", buf);
        }
        fclose(fp);
        return 0;
}


阅读(1266) | 评论(0) | 转发(0) |
0

上一篇:百度之星题目一

下一篇:PKU OnlineJudge - 1002

给主人留下些什么吧!~~