refactor
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
#include "stdio.h"
|
||||
|
||||
char char_first_appear_once(const unsigned char *source){
|
||||
int hash[256]={0};
|
||||
char *tmp = source;
|
||||
if (tmp == NULL) return '\0';
|
||||
while(*tmp != '\0'){
|
||||
hash[*tmp]++;
|
||||
tmp++;
|
||||
}
|
||||
|
||||
tmp = source;
|
||||
while(*tmp != '\0'){
|
||||
if (hash[*tmp] == 1) return *tmp;
|
||||
tmp++;
|
||||
}
|
||||
return '\0';
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
char *test = "77ah-ba-ccdeff";
|
||||
char c = char_first_appear_once(test);
|
||||
printf("c=%c\n", c);/* c = 'h'*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#include "stdio.h"
|
||||
|
||||
char *proc(char *str){
|
||||
char *start = str;
|
||||
char *end = str;
|
||||
if (str == NULL) return NULL;
|
||||
while(*end != '\0') end++;
|
||||
end--;
|
||||
|
||||
while(start < end){
|
||||
if (*start >= 'A' && *start <= 'Z'){//大写
|
||||
if (*end >= 'a' && *end <= 'z'){
|
||||
char tmp = *start;
|
||||
*start = *end;
|
||||
*end = tmp;
|
||||
|
||||
start++;
|
||||
}
|
||||
end--;
|
||||
}else{//小写
|
||||
if (*end >= 'A' && *end <= 'Z'){
|
||||
end--;
|
||||
}
|
||||
start++;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
char test[] = "HaJKPnobAACPc";//"char *test" always make "28767 bus error"
|
||||
printf("%s\n", proc(test));
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#include "stdio.h"
|
||||
|
||||
char *replace_blank(char *source){
|
||||
int count = 0;
|
||||
char *tail = source;
|
||||
if (source == NULL) return NULL;
|
||||
while(*tail != '\0'){
|
||||
if (*tail == ' ') count++;
|
||||
tail++;
|
||||
}
|
||||
|
||||
while(count){
|
||||
if(*tail != ' '){
|
||||
*(tail+2*count) = *tail;
|
||||
}else{
|
||||
*(tail+2*count) = '0';
|
||||
*(tail+2*count-1) = '2';
|
||||
*(tail+2*count-2) = '%';
|
||||
count--;
|
||||
}
|
||||
tail--;
|
||||
}
|
||||
|
||||
return source;
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
char str[100]="we are happy";
|
||||
printf("ret=%s\n",replace_blank(str));
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
#include "stdio.h"
|
||||
|
||||
void _reverse(char *start,char *end){
|
||||
if ((start == NULL) || (end == NULL)) return;
|
||||
while(start < end){
|
||||
char tmp = *start;
|
||||
*start = *end;
|
||||
*end = tmp;
|
||||
|
||||
start++,
|
||||
end--;
|
||||
}
|
||||
}
|
||||
|
||||
char *_revert_by_word(char *source){
|
||||
char *end = source;
|
||||
char *start = source;
|
||||
while(*start != '\0'){
|
||||
if (*start == ' '){
|
||||
start++;
|
||||
end++;
|
||||
}else if(*end == ' ' || *end == '\0'){
|
||||
_reverse(start,end-1);
|
||||
start = end;
|
||||
}else{
|
||||
end++;
|
||||
}
|
||||
}
|
||||
return source;
|
||||
}
|
||||
|
||||
char *revert_by_word(char *source){
|
||||
char *end = source;
|
||||
char *start = source;
|
||||
if (source == NULL) return NULL;
|
||||
while (*end != '\0') end++;
|
||||
end--;
|
||||
|
||||
/*整个句子逆序*/
|
||||
_reverse(start,end);
|
||||
|
||||
/*按单词逆序.tneduts a ma I */
|
||||
_revert_by_word(source);
|
||||
|
||||
return source;
|
||||
}
|
||||
|
||||
//为啥运行时 bus error?
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
char *test = "how are you ?";
|
||||
printf("%s\n",_revert_by_word(test));
|
||||
|
||||
test = "I am a student.";
|
||||
printf("%s\n",revert_by_word(test));
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,429 @@
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user