430 lines
5.6 KiB
C
430 lines
5.6 KiB
C
|
|
#include "stdio.h"
|
|
|
|
typedef int BOOL;
|
|
#define YES 1
|
|
#define NO 0
|
|
|
|
|
|
// 反序
|
|
void revert(const char *source,char *dest){
|
|
|
|
const char *s = source;
|
|
char *end = dest;
|
|
while(*s){
|
|
*end++ = *s++; //先拷贝字符串
|
|
}
|
|
*end='\0';
|
|
end--;// 指向最后一个字符
|
|
|
|
while(end>dest){
|
|
|
|
char tmp = *end;
|
|
*end = *dest;
|
|
*dest = tmp;
|
|
|
|
end--;
|
|
dest++;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
// 按单词逆向 如 this is a sentence 输出 sentence a is this
|
|
// 先按单词逆序,再对整个句子逆序
|
|
void revertByWord(const char *src, char *dest){
|
|
|
|
// 先拷贝字符串到dest
|
|
char *tmp = dest;
|
|
char *dest_end;
|
|
while(*src){
|
|
*tmp++ = *src++;
|
|
}
|
|
*tmp='\0';
|
|
dest_end = tmp-1; //这里留作下面用;
|
|
tmp = dest;
|
|
|
|
// 扫描一遍 dest,按单词逆序
|
|
char *start=dest-1,*end=dest;
|
|
while(*tmp){
|
|
|
|
if (*tmp == ' ')//逆序
|
|
{
|
|
start++;
|
|
|
|
//对单词逆向
|
|
while(end>start){
|
|
*start = *start + *end;
|
|
*end = *start - *end;
|
|
*start = *start - *end;
|
|
|
|
start++;
|
|
end--;
|
|
}
|
|
|
|
start=tmp;// 如果句子中又多个连续空格,也会对空格做逆序,浪费cpu
|
|
|
|
}
|
|
tmp++;
|
|
end=tmp-1;
|
|
}
|
|
|
|
if (!*tmp)//最后一个字符,对最后一个单词逆序
|
|
{
|
|
start ++;
|
|
while(end>start){
|
|
*start = *start + *end;
|
|
*end = *start - *end;
|
|
*start = *start - *end;
|
|
|
|
start++;
|
|
end--;
|
|
}
|
|
}
|
|
|
|
|
|
tmp = dest;
|
|
|
|
// 逆向整个句子
|
|
while(dest_end>tmp){
|
|
|
|
*tmp = *tmp + *dest_end;
|
|
*dest_end = *tmp - *dest_end;
|
|
*tmp = *tmp - *dest_end;
|
|
|
|
tmp++;
|
|
dest_end--;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 回文,或 对称
|
|
BOOL symmetrical(const char *scr,int length){
|
|
|
|
const char *end = scr+length-1;
|
|
BOOL is=YES;
|
|
|
|
while(end>scr){
|
|
|
|
if (*scr++ != *end--)
|
|
{
|
|
is=NO;
|
|
}
|
|
|
|
}
|
|
|
|
return is;
|
|
}
|
|
|
|
|
|
//找出第一个只出现一次的字符,找不到就返回‘0’
|
|
char first_appear_only_once(const char *source){
|
|
|
|
// 建立hash表
|
|
const int length=256;
|
|
int hash_table[length];
|
|
for (int i = 0; i < length; ++i)
|
|
{
|
|
hash_table[i]=0;
|
|
}
|
|
|
|
//第一次扫描,建立hash表
|
|
const char *tmp = source;
|
|
while(*tmp){
|
|
hash_table[*tmp++]++;
|
|
}
|
|
|
|
// 第二次扫描
|
|
while(*source){
|
|
|
|
if(hash_table[*source]==1){
|
|
|
|
return *source;
|
|
}
|
|
|
|
source++;
|
|
}
|
|
|
|
// 没找到
|
|
if (!*source)
|
|
{
|
|
return '0';
|
|
}
|
|
|
|
return '0';
|
|
}
|
|
|
|
|
|
|
|
|
|
// 最大对称子串的长度
|
|
int max_symmetrical_char_length(const char *scr){
|
|
|
|
int max_symmetrical_length=1;
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// 找最大数字子串
|
|
int continumax(char *outputstr,char *intputstr){
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
// 最大连续递增数字串
|
|
int continuousnum(const char *input, char *output){
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2个字符串的最长公共子串
|
|
int longest_common_subsequence(const char *s1,const char *s2, char *common){
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 找子串
|
|
char *strstr(const char *haystack, const char * needle){
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
// 子串个数
|
|
char *sub_str_count(const char *src, const char *substr, int *count){
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除子串
|
|
char *delete(char *source,const char *del,BOOL greedy){
|
|
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
|
|
// 字符串拷贝
|
|
char *strcpy(const char *src,char *dest){
|
|
|
|
char *tmp = dest;
|
|
while(*src){
|
|
|
|
*dest++ = *src++;
|
|
|
|
}
|
|
*dest = '\0';
|
|
|
|
return tmp;
|
|
}
|
|
|
|
|
|
|
|
// aabcd & bcad , abc&bca
|
|
BOOL isBrother(const char *first,const char *secd){
|
|
|
|
|
|
return YES;
|
|
}
|
|
|
|
|
|
|
|
|
|
// 字符串就地压缩 如 “aaabcc” “a3bc2”
|
|
/*
|
|
注意连续字符大于9的情况
|
|
*/
|
|
void compress(char *src){
|
|
|
|
if (*src == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int count = 1;
|
|
char *back=src,*forward=src+1;
|
|
|
|
while(*forward){
|
|
|
|
count = 1;
|
|
if (*forward == *back)
|
|
{
|
|
count++;
|
|
forward++;
|
|
|
|
}else{ //
|
|
|
|
if (count!=1)
|
|
{
|
|
back++;
|
|
*back=count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
*++back = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除其中的数字并压缩,2个指针,一前一后
|
|
void filternum(char *src){
|
|
|
|
if (!*src)
|
|
{
|
|
return;
|
|
}
|
|
|
|
char *back=src ,*forward=src;
|
|
while(*forward){
|
|
if (*forward >= '0' && *forward <= '9')
|
|
{
|
|
forward++;
|
|
}else{
|
|
*back++ = *forward++;
|
|
}
|
|
|
|
}
|
|
*back='\0';
|
|
|
|
|
|
// 局部变量释放,不能作为返回值
|
|
}
|
|
|
|
// 删除字符串中的数字,不改变原串,同上
|
|
char *filternumber(const char*src,char *dest){
|
|
|
|
|
|
return NULL;
|
|
}
|
|
|
|
// 删除指定字符,不开辟空间
|
|
void delete_character(char *src , char target){
|
|
|
|
char *back=src,*forward = src;
|
|
|
|
while(*forward){
|
|
|
|
if (*forward == target)
|
|
{
|
|
forward++;
|
|
|
|
}else{
|
|
|
|
*back++ = *forward++;
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*back = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 统计文件中单词的出现的个数
|
|
void statistics(FILE *fd){
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 字符串中字符的所有排列
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char const *argv[])
|
|
{
|
|
|
|
// 反转
|
|
char *reverse = "nonstriater";
|
|
char reversed[20];
|
|
revert(reverse,reversed);
|
|
printf("%s after reverse : %s\n", reverse,reversed);
|
|
|
|
|
|
// 按单词逆序
|
|
char *sentence = "this is a sentence!"; // "this is a sentence"
|
|
char dest[50];
|
|
revertByWord(sentence,dest);
|
|
printf("%s revert by word: %s\n",sentence,dest );
|
|
|
|
|
|
|
|
// 回文
|
|
char symmetri[] = "dacbcacbcad";
|
|
printf("%s : %d\n", symmetri, symmetrical(symmetri,sizeof(symmetri)-1) );
|
|
|
|
char unsymmetrical[] = "aaacbdaa";
|
|
printf("%s : %d\n", unsymmetrical, symmetrical(unsymmetrical,sizeof(unsymmetrical)-1) );
|
|
|
|
|
|
// 第一次出现一次的字符
|
|
printf("%s第一次出现一次的字符是:%c\n",symmetri,first_appear_only_once(symmetri) );// '0'
|
|
printf("%s第一次出现一次的字符是:%c\n",unsymmetrical,first_appear_only_once(unsymmetrical) ); // 'c'
|
|
|
|
// 过滤数字
|
|
char *charnumber = "this is 58tongcheng12haha!";
|
|
//filternum(charnumber);
|
|
printf(" after filter: %s\n", charnumber );
|
|
|
|
|
|
// 过滤指定字符
|
|
//delete_character(charnumber,'i'); // 居然会出 bus error!!!!!????
|
|
printf("after filter:%s\n", charnumber);
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|