读书人

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

发布时间: 2012-03-09 16:54:57 作者: rapoo

请大家帮下忙看看那里错了.我基础不好.谢谢了
#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); 这样就写入了转换后的字符了 ~

读书人网 >C语言

热点推荐