//2 字符串处理转换
//问题描述:
//在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,
//其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);
//找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),
//然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;
//如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
//要求实现函数:
//void my_word(charinput[], char output[])
//【输入】 char input[], 输入的字符串
//【输出】 char output[],输出的字符串
//【返回】 无
//示例
//输入:charinput[]="some local buses, some1234123drivers" ,
//输出:charoutput[]="drivers local buses some"
//输入:charinput[]="%A^123 t 3453i*()" ,
//输出:charoutput[]=""
#include<stdio.h>
#include<assert.h>
void my_word(char input[ ], char output[ ])
{
assert(input);
assert(output);
int flag = 1;//一个标识,为1表示遇到了非字母的字符
int i = 0; //作为扫描字符串的标识
int newp = 0; //作为存放调整后字符串的标识 //把字符串进行扫描,变成英语的句式 “(单词1)_(单词2)+(单词3)” 中间的间隔式非字母字符
while(input[i] != '\0') //此处i作为一个扫描指针,newp作为一个调整后的指针,存放符合要求的字符
{
if(( (input[i] < 'A' )||(input[i] > 'Z'&&input[i]<'a') || ( input[i] >'z'))&& (flag == 1) )//之前遇到了非字母,现在遇到的是非字母
{
i++;
}
else if(((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z'))&& (flag == 1) )//之前遇到了非字母,现在遇到的是字母
{
input[newp++] = input[i++] ;
flag = 0;
} else if ( ((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z'))&& (flag == 0) )//之前遇到了字母,现在遇到的是字母
{
input[newp++] = input[i++];
}
else //之前遇到了字母,现在遇到的是非字母
{
input[newp++] = input[i++] ;
flag = 1;
}
} input[newp] = '\0';
printf("%s\n",input); //输出调整后的字符 int NumOfNotchar = 0 ;//统计出字符串中的单词数,NumOfNotchar+1
i = 0;
while(input[i] != '\0' )
{
if( (input[i] < 'A' )||(input[i] > 'Z'&&input[i]<'a') || ( input[i] >'z')) //通过非字母的个数来判断调整后单词的个数
NumOfNotchar++;
i++;
}
newp = 0;
int lastpos = 0; //存放之前字符串中最长单词的长度的位置
int lastlength = 0; //存放之前字符串中最长单词的长度
for(int n = 0; n < NumOfNotchar ; n++ ) //
{
i = 0;
int maxlength = 0; //存放当前字符串中最长单词的长度
int length = 0; //记录单词的长度
int maxpos = 0;//存放当前字符串中最长单词的长度的位置
int flag2 = 0; //作为一个标识,判断当前单词与上一个单词是否一样 //当前字符串中的最个数
int Numofinput = 0;
while(input[i] != '\0' )
{
Numofinput++;
i++;
} i = 0; //作为扫描字符串的指针
int prepos = Numofinput; //prepos存放(再长度相同情况下最前面)最长单词的起始位置 while(i <= Numofinput )
{
if( ((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z')) ) //遇到的是字母
{
length++;
i++;
continue;
}
else if (length >= maxlength && length!=1 ) //遇到非字母了
{ i++; maxpos = i-length-1 ; //暂时存放当前最大的单词的起始位置
if( length > maxlength) //除非你比最大的长度还大,否则不改变prepos起始位置,prepos存放(再长度相同情况下最前面)最长单词的起始位置
{
prepos = maxpos;
} maxlength = length;
length = 0; if( maxlength == lastlength ) //如果当前的最长字符和之前的字符等长,判断是否相等
{
for(int j = 0; j<maxlength; j++)
{
if(input[(prepos+j)] == output[(lastpos+j)])
{
;
}
else //说明当前字符和之前的字符是不相等的
break; }
if (j == (maxlength )) //说明当前字符和之前的字符是相等的
flag2 = 1;
continue;
}
}
else //遇到非字母了,但是之前的单词没有maxlength长
{
i++;
length = 0;
}
} if( flag2 != 1 ) //如果当前字符和之前的字符是不相等,就将这个字符放入output中
{
int j = newp;
lastpos = newp;
lastlength = maxlength;
for(j =prepos; j < (prepos+maxlength); j++ )
{
output[newp++] = input[j];
}
output[newp++] = ' ';
}
//把这个单词去掉
int start = prepos;
int end = prepos + maxlength; if(input[ end]== '\0') //如果只剩下一个空字符串了
{
input[ start] = input[end];
input[start-1]='\0';
}
else //把当前后面的到结尾全部往前移
{
start--;
while(input[ end]!= '\0')
{
input[ start++] = input[end++];
}
input[start]='\0';
}
} output[newp] = '\0';
printf("%s\n",output);
}
int main()
{
char input[] = "some local buses, some1234123drivers max max";
char output[1000];
printf("%s\n",input);
my_word(input, output);
return 0;
}

H面试程序(28):字符串处理转换的更多相关文章

  1. H面试程序(27):字串转换

    //1 字串转换 //问题描述: //将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a: //若输 ...

  2. H面试程序(10): 字符串包含问题

    题目描述:判断第二个字符串中的元素是否都能在第一个字符串中找到: 注意:和字符串的字串的问题有所区别,如第一个字符串为  abcdefg,第二个字符串为 aaabc,第二个字串还是包含于第一个字符串 ...

  3. H面试程序(11): 判断字符串是否包含子串问题

    题目描述:                        如字符串str1为''abcdef'''                       字符串str2为'' bc''; 则字符串str1中含有 ...

  4. H面试程序(12): 输出字符串中第一个只出现一次的字母

    题目描述: 若字符串str为'' sbdddsbfc'',则输出 f; 若字符串str为''aabbccdd'',则输出:字符串str中的字符都出现两次以上 #include <stdio.h& ...

  5. H面试程序(4):翻转句子中单词的顺序 .

    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“stude ...

  6. H面试程序(1)编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的 下一秒

    编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒. 如输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005年 1 月 1 日 0 时 0 分 0 秒. ...

  7. H面试程序(29):求最大递增数

    要求:求最大递增数 如:1231123451 输出12345 #include<stdio.h> #include<assert.h> void find(char *s) { ...

  8. H面试程序(15): 冒泡排序法

    #include<stdio.h> #include<assert.h> void display(int * a, int n) { for(int i = 0; i < ...

  9. H面试程序(16): 简单选择排序

    #include<stdio.h> #include<assert.h> void display(int * a, int n) { assert(a); for(int i ...

随机推荐

  1. JavaEE Tutorials (10) - Java持久化查询语言

    10.1查询语言术语14010.2使用Java持久化查询语言创建查询141 10.2.1查询中的命名参数142 10.2.2查询中的位置参数14210.3简化的查询语言语法142 10.3.1选择语句 ...

  2. HDOJ 1427(dfs) 速算24点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路分析: 题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不 ...

  3. Spark调研笔记第2篇 - 怎样通过Sparkclient向Spark提交任务

    在上篇笔记的基础上,本文介绍Sparkclient的基本配置及Spark任务提交方式. 1. Sparkclient及基本配置 从Spark官网下载的pre-built包中集成了Sparkclient ...

  4. c#关于EXCEL导入数据库的做法

    以下例子转载:互联网 先在类中定义一个方法名为ExecleDs的方法,用于将Excel表里的数据填充到DataSet中,代码如下 public DataSet ExecleDs(string file ...

  5. HTML之标签

    一.HTML 标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag). •HTML 标签是由尖括号包围的关键词,比如 <html> •HTML 标签通常是成对出现的,比如 ...

  6. ubuntu中彻底删除nginx

    1.先执行一下命令: 1.1 删除nginx,–purge包括配置文件 sudo apt-get --purge remove nginx 1.2 自动移除全部不使用的软件包 sudo apt-get ...

  7. MySQL 5.7.14 安装

    http://www.cnblogs.com/zcGu/articles/5740936.html 因笔者个人需要需要在本机安装Mysql,先将安装过程记录如下,希望对他人有所参考. 一, 1, 进入 ...

  8. NOIP2015前

    时间过得好快...明天就要出发去NOIP了...然后再过半年就要省选了....希望自己能取得好成绩吧... NOIP2015 bless all !

  9. Arcengine 开发,FeatureClass新增feature时“The Geometry has no z-value”或"The Geometry has null z-value"的解决方案

    Arcengine 开发,当图层含有Z值时,新增的feature没有Z值就会 出现“The Geometry has no z-value”的错误.意思很明显,新增的geometry没有Z值. 此时按 ...

  10. poj 1204

    http://poj.org/problem?id=1204 大意:给出一个棋盘puzzle,,和w个模式串,,在棋盘中寻找模式串..棋盘中任意一格有8个方向可以走.. 解题思路: AC自动机 + 枚 ...