首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请大家帮下忙看看那里错了.小弟我基础不好.多谢了

2012-03-09 
请大家帮下忙看看那里错了.我基础不好.谢谢了#includestdlib.h#includemath.h#includestring.h#incl

请大家帮下忙看看那里错了.我基础不好.谢谢了
#include   <stdlib.h>
#include   <math.h>
#include   <string.h>
#include   <ctype.h>
#include   <stdio.h>
/*这是一个读出一个含有转义字符的文本,经过该程序输出一个转义后真实字符文本,\123代表3位八进制ASC码所对应的字符,\1234多余3位就表示成(1234)O,十六进制同理.\x20   2位16进制表示.*/
void   oconvert(char,FILE   *);//八进制的判断
void   main()
{
FILE   *in,*out;
char   infile[20],outfile[20],ch;
printf( "输入要转义文件的文件名: ");
scanf( "%s ",infile);
printf( "输入要存放转义后文件的文件名: ");
scanf( "%s ",outfile);
        in=fopen(infile, "r ");
        out=fopen(outfile, "w ");
while(!feof(in))
        {      
ch=fgetc(in);
        if   (ch== '   ')   fputc(char(32),out);       //判断字符串中的空格
else   if   (ch== '\\ ')      
      {ch=fgetc(in);
if   (ch> 47   &&   ch <56)   oconvert(ch,out);
else   {
        switch   (ch)
{
                  //case   'x ':
          case   'a ':   fputc(char(7),out);
      break;
          case   'b ':   fputc(char(8),out);
      break;
          case   'f ':   fputc(char(12),out);
      break;
          case   'n ':   fputc(char(10),out);
      break;
          case   'r ':   fputc(char(13),out);
      break;
          case   't ':   fputc(char(9),out);
                                      break;
          case   'v ':   fputc(char(11),out);
                                      break;
          case   '\\ ':   fputc(char(92),out);
                                      break;
                                  case   '\? ':   fputc(char(63),out);
                                      break;
          case   '\ ' ':   fputc(char(39),out);
                                      break;
          case   '\ " ':   fputc(char(34),out);
                                      break;
          case   '\0 ':   fputc(char(0),out);


      break;
      default:fputc(char(92),out);fputc(ch,out);                                                  
}
}
}
              else   fputc(ch,out);
}
fclose(in);
fclose(out);
}
void   oconvert(char   ch,FILE   *out)
{
int   i=0,b;
char   a[]= " ";
        while(ch> 47   &&   ch <56)
{
a[i]=ch;
i++;
}
a[i]= '\0 ';
if   (i==2)   fputc(char((a[0]-48)*64+(a[1]-48)*8+a[2]-48),out);
        else  
{
fputc( '( ',out);
b=strlen(a);
for(i=0;i <b;i++)
{
fputc(a[i],out);
}
fputc( ') ',out);
}
}


[解决办法]
Re:好.我是转义字符的文本那位.你能帮我解决下\1后面该怎么办么。我连续发了三次就不能在回复了。提示我下.我把分全给你....

简单,
先考虑 8 进制转义字符(\0x十六进制类似即可),
\后面是数字,那么认为是 8进制转义字符,
比如读取了 \1 那么认为这里是一个 8进制转义,
然后继续读取字符,注意,只读取数字字符,
一般情况下是 3 个字符转义,(其他的很少用8进制转义)
比如读取了 \1 后读到了 2、3 这么两个数字字符,
那么组合可以得到 "123 ",【构造为一个字符串】
然后通过 strtol 转换字符串为 8进制数值 123 = i,
然后 fprintf(fp, "%c ", i); 这样就写入了转换后的字符了 ~

热点排行