诡异的getchar() ————由hdu1075Tire所想到的

     一晚上, 写代码用了部分时间,其他时间就浪费在一个getchar()上了,小失误大问题啊啊!!!!!!!!!!

    这道题的题意很简单,就是字典树的创建和查找,很快完成了,刚开始一提交,一个数组开小了,提示RunTime Error,于是将字典的词数扩大到一百万,这时候问题出现了,PE,显示出错,后来加了个getchar()解决。附代码:

102995052014-03-14 21:23:59Accepted1075281MS67892K2919 BC++天涯路

#include<cstdio>
#include<cstdlib>
#include<string>
#include<iostream>
using namespace std;
typedef struct Tire
{
   int final;
   struct Tire *next[26];
}Tire;

    //创建一个头节点
   int flag=0;
  char e_word[1000000][12];
  char s[12];
  char line[3100];
  char temp[12];
 void creat_tire(char s[],int final_num,Tire *head)
 {
     Tire *p1;
     Tire *p2;
     p1=head;
   for(int i=0;s[i]!='\0';i++)
   {
       int k=s[i]-97;
       if(p1->next[k]==NULL)
       {
         p2=(Tire *)malloc(sizeof(Tire));
         p2->final=0;
         for(int j=0;j<26;j++)
             p2->next[j]=NULL;
     
         p1->next[k]=p2;
         p1=p2;
       }
     else
         p1=p1->next[k];
   }
   p1->final=final_num;

 }

 //find 查找字典树,如果存在就输出,否则就打印原来的
 void find(char temp[],int size, Tire *head)
 {
    Tire *p1;
    //Tire *p2;
    p1=head;
    int flag_find=1;
    for(int i=0;temp[i]!='\0';i++)
    {
      int k=temp[i]-97;
      if(p1->next[k]==NULL)
      {
        flag_find=0;
        break;
      }
      else
          p1=p1->next[k];
    }
    if(flag_find==0)
        printf("%s",temp);

    else
    {
      if(p1->final==0)
             printf("%s",temp);
      else
      {
          int find_num=p1->final;
          printf("%s",e_word[find_num]);

      }
    }
//    cout<<11111<<endl;
 }
void io_handle(Tire *head)//处理输入问题 
{
    int num=-1;
    int final_num=0;
    memset(s,'\0',sizeof(s));
  memset(e_word,'\0',sizeof(e_word));
  while(scanf("%s",s)!=EOF)
  { 
      num++;
    if(s[0]=='S')
    {
      memset(s,'\0',sizeof(s));
      continue;
    }
    if(s[0]=='E')
    {
        memset(s,'\0',sizeof(s));
        num=0;
         break;
    }
    if(num%2==1)//输入为英语单词
    {
        final_num=num/2+1;
        
       for(int i=0;s[i]!='\0';i++)
           e_word[final_num][i]=s[i];
      
    }
    else//输入为火星文
    {
       creat_tire(s,final_num,head);
        
    }
   memset(s,'\0',sizeof(s));

  }//first_while
  memset(line,'\0',sizeof(line));
    int cnt=0;
    getchar();//问题出现的地方
  while(gets(line))
  {
      cnt++;
    
    if(line[0]=='S')
    {
      memset(line,'\0',sizeof(line));
       continue;
    }
    if(line[0]=='E')
    {
        memset(line,'\0',sizeof(line));
        break;
    }
    int i=-1;
    int tmp=-1;
    while(line[++i]!='\0')
    {
      if(line[i]>=97 && line[i]<=122)
      {
        flag=1;
        temp[++tmp]=line[i];

      } 
      else
      {
          if(flag==1)
          {
             find(temp,tmp+1,head);
             printf("%c",line[i]);
             flag=0;
             tmp=-1;
          memset(temp,'\0',sizeof(temp));
          }
          else
              printf("%c",line[i]);

          }//else
         
          
    }
     if(flag==1)
          {
           find(temp,tmp+1,head);
             //printf("%c",line[i]);
             flag=0;
             tmp=-1;
          memset(temp,'\0',sizeof(temp));
            
          }
//    if(cnt>0)
     printf("\n");
}//second while
}

int main()
{
       Tire *head=NULL;
    head=(Tire *)malloc(sizeof(Tire));
    head->final=0;
    for(int i=0;i<26;i++)
    
        head->next[i]=NULL;

    io_handle(head);
    
    return 0;    
}


     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值