求C语言 字符数据处理

如题所述

第1个回答  2013-12-02
对字符的处理一直在c语言中占有很重要的地位。想想也是,通过键盘敲进去的都是些字符,最后还得转换成别得类型来操作。

一个很典型得代表就是将字符串转换为十进制整数得函数atof(char s[])。其中的核心就是下面这个语句

for(val = 0.0;isdigit(s[i]);i++)
val = 10.0 * val + (s[i] - '0');

从中可以看出,字符完全可以当作一般的数进行加减的操作。

还有一点很重要的就是对字符处理的技巧。一个例子:函数expand(s1,s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc...xyz。该喊出可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与a-z等类似的情况。作为前导和尾随的字符原样复制。

以下是我自己编写的程序的思路:

自己的思路是先判断当前处理的字符是否为‘-’,如果不是则复制字符,是的话再分为3种情况处理,就是‘-’再字符串的位置是第一个字符,或最后一个,或者是中间。因为要求是前导和尾随的字符原样复制。

相比之下答案就显的简洁的多。一个区别就是答案的处理方式是以当前字符为基准,判断后面两个字符的情况。

while((c = s1[i++]) != '\0')

if(s1[i] == '-' && s1[i+1] >= c){

i++;

while(c < s1[i])

s2[j++] = c++;

}else

s2[j++] = c;

s2[j] = '\0';

}

即当前字符不是最后一个字符,就判断后面的字符,如果为'-'且第三个字符大于第一个字符(即并非前导和后缀的情况),就逐个复制。如果不是就复制当前字符到s2【】。这样做的好处是避免了在一个分支中再出现多个分支的情况,将前导和后缀的情况也归到了直接复制的一类,使程序的逻辑清晰,可读性很强。

这说明了在设计分支程序时,要注意归纳分支的共同点,化整为零,减少分支数目可以降低复杂度和设计难度。

在编写计算器程序时,其实让我花时间最多去研究的,竟然是看似最简单的输入函数,它接受由键盘输入的字符,并存入字符数组s[]。究其原因,大概有两点:

1 接收输入的函数要判断输入的是合种字符,如:数字,字母或是小数点,原因是要和主程序中的分支程序对应起来,并不是非得这么复杂的。这说明在设计程序时必须先要有一个总体框架,否则实现起来要修改会很难。

2 增加了一个缓冲区,这可以增加程序的灵活性,上一次输入的数字可以暂时存入缓冲区。
第2个回答  2013-12-02
这是我前些时候写的一个,先发上来了,还有什么更多的需要请补充:

static char ch0[81],ch[81];
main()
{
int a;
int insch();int delch();int filch();
printf("本程序用于进行简单的字符操作\n");
printf("\n请输入您想用于操作的字符串(字符个数不能大于80)\n");
loop1: for(a=0;a<=80;a++)ch0[a]="";
gets(ch0);
if(strlen(ch0)>=80&&ch0[80]!='\0')
{
printf("字符串过长,请重新输入\n");
goto loop1;
}
for(a=0;a<=80;a++)ch[a]=ch0[a];
loop2: printf("您想对它进行什么操作?\n1=在指定位置插入一个字符\n2=过滤掉某特定字符\n3=删除指定位置上的字符\n4=重置字符串\n");
scanf("%d",&a);
switch(a)
{
case 1:a=insch();break;
case 2:a=filch();break;
case 3:a=delch();break;
case 4:for(a=0;a<=80;a++)ch[a]=ch0[a];a=1;break;
default:a=2;break;
}
if(a==1)
{
printf("您接下来要\n1=对同一个字符串进行其它操作\n2=输入新的字符串并进行操作\n3=退出程序\n");
scanf("%d",&a);
switch(a)
{
case 1:goto loop2;break;
case 2:goto loop1;break;
case 3:printf("任务已经完成,感谢您的使用\n");goto loop3;break;
default:break;
}
}
printf("您没有按要求操作,现在程序要强制关闭\n");
loop3: ;
}
void ruler()
{
int a,b;
for(a=0;a<9;a++)printf("0");
for(a=1;a<=7;a++)for(b=0;b<=9;b++)printf("%d",a);
printf("8");
for(a=0;a<=7;a++)printf("1234567890");
}
int insch()
{
int a;char b;
void tor();
insloop2: ruler();
puts(ch);
printf("请按\"xx,y\"的格式输入您想要插入字符的位置(xx)和想要插入的字符(y)\n请不要忘记它们之间的逗号\n");
scanf("%d,%c",&a,&b);
insloop1: if(a<=0||a>80)
{
printf("无效位置,请重新输入位置(仅输入位置即可):");
scanf("%d",&a);
goto insloop1;
}
if(strlen(ch)>=80)
{
printf("字符串过长,超出的部分可能会被丢掉,继续吗?(1=Yes,else=No)\n");
if(getchar()!='1')return(1);
}
tor(a-1);
ch[a-1]=b;
puts(ch);
printf("插入完成,继续插入吗?(1=Yes,else=No)\t");
getchar();
if(getchar()=='1')goto insloop2;
else return(1);
}

字数有限,其余的部分我等一下补充
相似回答