字符串提取的函数代码!不准用字符处理函数实现!

good170 2010-01-22 09:44:39


给定一个字符串如:“ewewewe,.,,rerere-;;ewewewe'rerrere”

如何将字符串提取出来,打印如下:

ewewewe

rerere

ewewewe

rerrere

调用函数 tiqu(cha const *p,char *s)

如何实现呢??要求,不准用字符处理函数实现!
...全文
291 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhao4zhong1 的回复:]
sscanf(str,"%[0-9A-Za-z]%[0-9A-Za-z]%[0-9A-Za-z]%[0-9A-Za-z]",s1,s2,s3,s4);
[/Quote]
更正:
#include <stdio.h>
void main() {
char s1[32];
char s2[32];
char s3[32];
char s4[32];
char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
sscanf(istr,"%[a-z]%*[^a-z]%[a-z]%*[^a-z]%[a-z]%*[^a-z]%[a-z]",s1,s2,s3,s4);
printf("%s\n%s\n%s\n%s\n",s1,s2,s3,s4);
}
weiqibaxia 2010-01-25
  • 打赏
  • 举报
回复

#include <iostream>
#include <malloc.h>
using namespace std;
void tiqu(char const *p,char *s)
{
int flag=0;
while(*p!='\0')
{

if((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z'))
{
*s++=*p;
flag=1;
}
else
{
if(flag==1)
*s++='\n';
flag=0;
}
++p;
}
*s='\0';
}

int main()
{
char *pstr="ewewewe,.,,rerere-;;ewewewe'rerrere";
char *str;
str=(char *)malloc(128*sizeof(char));
tiqu(pstr,str);
cout<<str<<endl;
free(str);
return 0;
}
weiqibaxia 2010-01-25
  • 打赏
  • 举报
回复
#include <iostream>
#include <malloc.h>
using namespace std;
void tiqu(char const *p,char *s)
{
int flag=0;
while(*p!='\0')
{

if((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z'))
{
*s++=*p;
flag=1;
}
else
{
if(flag==1)
*s++='\n';
flag=0;
}
++p;
}
*s='\0';
}

int main()
{
char *pstr="ewewewe,.,,rerere-;;ewewewe'rerrere";
char *str;
str=(char *)malloc(128*sizeof(char));
tiqu(pstr,str);
cout<<str<<endl;
free(str);
return 0;
}
jinjinClouded 2010-01-25
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
void tiqu(char const *p,char *s)
{
char* pTemp=NULL;
char* str=NULL;
if (p)
{
pTemp=(char*)p;
str=s;
while(*pTemp!='\0')
{
if ((*pTemp>='a'&&*pTemp<='z')||(*pTemp>='A'&&*pTemp<='Z'))
{
*str=*pTemp;
++str;
}
else
{
--pTemp;
if ((*pTemp>='a'&&*pTemp<='z')||(*pTemp>='A'&&*pTemp<='Z'))
{
*str='\n';
++str;
}
++pTemp;
}
++pTemp;
}
*str=0;
}
}
int main()
{
const char* pStr="ewewewe,.,,rerere-;;ewewewe'rerrere";
char pDest[64];
memset(pDest,0,sizeof(char)*64);
tiqu(pStr,pDest);
cout<<pDest<<endl;
return 0;
}


嘿嘿 随便写了一个。。。
赵4老师 2010-01-25
  • 打赏
  • 举报
回复
sscanf(str,"%[0-9A-Za-z]%[0-9A-Za-z]%[0-9A-Za-z]%[0-9A-Za-z]",s1,s2,s3,s4);
we_sky2008 2010-01-25
  • 打赏
  • 举报
回复

#define isalpha(a) ((a >= 'a' && a <= 'z') || (a>= 'A' && a <= 'Z'))

char* convert(const char *src, char *dynamic)
{
char ch;
char flag = 0;//初始值为0时最前面的非字母去不用换行代替 为1时最前面的非字母用换行代替
char *dynamic_save = dynamic;

if (src == NULL)
return NULL;
while(ch = *src++)
{
if (isalpha(ch))
{
*dynamic++ = ch;
flag = 1;
}
else
{
if (flag)
{
*dynamic++ = '\n';
flag = 0;
}
}
}
*dynamic = '\0';
return dynamic_save;
}
good170 2010-01-24
  • 打赏
  • 举报
回复
都是高手中的高手啊,这个题目是某大公司的笔试题,看来大家都过关了!
耍宝王 2010-01-23
  • 打赏
  • 举报
回复
LS强,真是敢想敢做啊~
耍宝王 2010-01-23
  • 打赏
  • 举报
回复
睡前把代码又改了一下——天晓得是改好了,还是更坏了

#include <stdio.h>

void tiqu(char const* p, char* s)
{
while(*s = *p) //原先想while(*s++ = *p++),结果后面的处理就会变复杂了,所以放弃
{
++p;
if ((*s <= 'a' || *s >= 'z') && (*s <= 'A' || *s >= 'Z'))//使用宏会清爽些
{
*s = '\n';
while ((*p <= 'a' || *p >= 'z') && (*p <= 'A' || *p >= 'Z'))
++p;
}
++s;
}
}

int main()
{
char str[255];
char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
tiqu(istr, str);
printf("%s\n", str);
return 0;
}


P.S 刚才发现我4楼代码的第15行,有问题
//第15行
*s = '\0';//没必要*s++ = '\0';虽然不影响结果,但是影响效率
mstlq 2010-01-22
  • 打赏
  • 举报
回复
风格好点的写法……

#include <stdio.h>
int isa(char a)
{
return ('A'<= a && a<='Z' || 'a'<= a && a<='z');
}

void cutprint(const char*str)
{
for(int flag = -1; *str!='\0'; ++str) {
if(isa(*str)) {
putchar(*str);
flag=1;
} else {
if (1 == flag) putchar('\n');
flag=-1;
}
}
return;
}

int main()
{
const char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
cutprint(istr);
return 0;
}
mstlq 2010-01-22
  • 打赏
  • 举报
回复
提供一个虽然可以达到要求,但是代码风格极差的例子……
这是用来展示代码之丑的,千万别学……

#include <stdio.h>
#define isa(a) ('A'<= a && a<='Z' || 'a'<= a && a<='z')
int main()
{
const char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
for(int flag=-1;*istr && (isa(*istr)?( putchar(*istr), flag =1):((flag==1?putchar('\n'):0),flag=-1)); ++istr);
return 0;
}
耍宝王 2010-01-22
  • 打赏
  • 举报
回复
有意思,这是我的
#include <stdio.h>

void tiqu(char const* p, char* s)
{
while(*p)
{
if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z'))
*s++ = *p++;
else {
*s++ = '\n';
while ((*p <= 'a' || *p >= 'z') && (*p <= 'A' || *p >= 'Z'))
++p;
}
}
*s++ = '\0';
}

int main()
{
char str[255];
char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
tiqu(istr, str);
printf("%s", str);
return 0;
}
febbird1984 2010-01-22
  • 打赏
  • 举报
回复
void tiqu(char const *p,char *s)//由调用该函数的程序员保证参数的合法性
{
char* start=(char*)p;
char* end=(char*)p;//定义一个头指针和尾指针

while(*end!='\0')
{
while(!(*end>='a' && *end<='z') || (*end>='A' && *end<='Z'))
{
++end;
}

start=end;//将头尾指针跳过非字母字符,定位到某个字母子串的第一个字母

while((*end>='a' && *end<='z') || (*end>='A' && *end<='Z'))
{
++end;//将尾指针定位到该字母子串的后一个字符
}

while(start!=end)
{
*s++=*start++;//将头尾指针之间的内容复制到s中
}
*s++='\n';//添加一个'\n',并且将s指向下一个字节用来保存下一个子串
}
*--s='\0';//将最后一个'\n'改为'\0'结束字符串
}
lovesi3344 2010-01-22
  • 打赏
  • 举报
回复
坐等mstlq回答
mstlq 2010-01-22
  • 打赏
  • 举报
回复
这个不难,出去喝个小酒再回来写,在这之前,请楼主先看看下面的
http://topic.csdn.net/t/20020312/11/570255.html

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧