2楼那个代码看起来简洁,不过认真点来看还是有些值得注意的地方~
我简单说明了一下具体情况,如果有说得不到位的地方还请多多指教
程序代码:
#include<stdio.h>
#include<string.h>
//int flag[127]={0}; 全局变量尽可能少用~而且全局变量由于属于静态变量,初始值已经为0,就算用也没必要再重新赋值一次0了,而且最主要的一点就是重复调用函数的时候flag没有重新清零这样就见笑了~
void fun( char* p ) //char arr[]
{
char flag[127];
//char型已经足够储存空间了
//int flag[127]={0}; 有些编译器不支持这样清零,可以用for循环清零或者memset清零
//char* a=arr,*b=arr;
char *q=p;
memset(flag,0,sizeof (flag));
//for(;(flag[*b]==0)?(*a++=*b):*b;flag[*b]++,b++);
while ((!flag[*p])?(flag[*q++=*p++]=*p):(*p++));
//虽然这样写形式还是有点复杂,但感觉比之前的还要简洁并且容易理解
// *a='\0'; 这里末尾已经把'\0'复制进去了就不用再补'\0'了~
}
int main()
{
char str[100];
fgets(str,100,stdin);
//str[strlen(str)-1]='\0';
//由于缓冲区写满的时候是不含'\n'的,固当缓冲区满的时候这样会弄走了最后那个有效字符
str[strcspn(str,"\n")]='\0';
fun(str);
fputs(str,stdout);
return 0;
}
自己弄那个相对于2楼也没多大改动,看看就可以了
~
程序代码:
#include<stdio.h>
void fun( char* );
int main( void )
{
char str[100];
fgets(str,sizeof (str),stdin);
str[strcspn(str,"\n")]='\0';
fun(str);
fputs(str,stdout);
return 0;
}
#include<assert.h>
#include<string.h>
void fun( char* p )
{
char flag[127];
char *q=p;
assert(p);
memset(flag,0,sizeof (flag));
while ((!flag[*p])?(flag[*q++=*p++]=*p):(*p++));
}
[此贴子已经被作者于2018-4-21 13:35编辑过]