很老的笔试题,大家看看。

MingInCode 2009-12-18 11:21:05
反转一句话中的单词,例如“how@are#you?”反转为:“you@are#how?”
我搜索了大部分的解答,都是说先反转整句然后反转各个单词,请注意标点符号,例如例子中的?号反转后还是在最后面的
请大家考虑的时候,用C来考虑,不要用什么split之类的函数,分隔符不仅仅是空格,但是单词仅有大小写字母构成,注意反转后标点的位置。
...全文
344 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
leighjian 2011-07-28
  • 打赏
  • 举报
回复
mark,学习下
mstlq 2009-12-19
  • 打赏
  • 举报
回复
正确但是绝对欠揍的代码,楼主别学……

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
char words[50][256],symbols[50],dest[256];

int main()
{
char *str="how@are#you?";
char *src=str,*des=dest;
int i=0,widx=0,widx2=0,sidx=0;
for(;*src!='\0'; isalpha(*src) ? (words[widx][widx2++]=*src++) :(widx++,widx2=0,symbols[sidx++]=*src++));
for(i=0;i<widx;i++) for(src=words[widx-i-1];*src!='\0' || (*des++=symbols[i],0);*des++=*src++);
puts(dest);
return 0;
};

罗耗子 2009-12-19
  • 打赏
  • 举报
回复
用两栈,一个放单词,一个放标点,单词倒序出栈,标点顺序出栈,空格自己补.
shuiqin 2009-12-19
  • 打赏
  • 举报
回复
学习。。
mstlq 2009-12-19
  • 打赏
  • 举报
回复
c……
随手写的……

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

char words[50][256];
char symbols[50];
char dest[256];

int main()
{
char *str="how@are#you?";
char *src=str,*des=dest;
int i=0,widx=0,widx2=0,sidx=0;

for(;*src!='\0'; ++src)
if(isalpha(*src))
words[widx][widx2++]=*src;
else
{
widx++;
widx2=0;
symbols[sidx++]=*src;
}

for(i=0;i<widx;i++)
{
for(src=words[widx-i-1];*src!='\0';*des++=*src++);
*des++=symbols[i];
}
*des='\0';
puts(dest);

return 0;
};
Queequeg_zz 2009-12-19
  • 打赏
  • 举报
回复
void divs(char *p,char *d)
{
int i=0;
char *o;/*必须保存源字符串起始指针,因为第二步要将源字符串拷贝到目标字符串*/
o=p;
char *point[100];/*获取每个单词在字符串中的位置,为下面将单词倒叙拷贝*/
while(*p!='\0')
{
while((*p!='\0')&&!isalpha(*p++));/*跳过非字母*/
if(isalpha(*p))/*如果是字母而不是结束符,就将单词起始字母在字符串中的位置保存下来*/
{
point[i++]=p-1;
}
while((*p!='\0')&&isalpha(*p++));/*跳过单词*/
}
i=i-1;/*回到最后一个单词的起始字母位置*/
while((i>=0)||(*o!='\0'))
{

while((*o!='\0')&&!isalpha(*o))/*如果非字母,拷贝到目标字符串*/
{
*d++=*o++;
}
if(isalpha(*o))/*如果下一个是字母而不是结束标志*/
{
while(isalpha(*point[i]))/*将单个单词以倒叙方式拷贝到目标字符串*/
{
*d++=*point[i]++;
}
}
while((*o!='\0')&&isalpha(*o))/*跳过单词*/
{
*o++;
}
i--;
}
*d='\0';/*添加结束标志*/
}
罪过了 抱歉楼主
Queequeg_zz 2009-12-19
  • 打赏
  • 举报
回复
楼主 不好意思 我再贴一次 学学怎么贴C代码 您看着不舒服就删了吧
void divs(char *p,char *d)
{
int i=0;
char *o;/*必须保存源字符串起始指针,因为第二步要将源字符串拷贝到目标字符串*/
o=p;
char *point[100];/*获取每个单词在字符串中的位置,为下面将单词倒叙拷贝*/
while(*p!='\0')
{
while((*p!='\0')&&!isalpha(*p++));/*跳过非字母*/
if(isalpha(*p))/*如果是字母而不是结束符,就将单词起始字母在字符串中的位置保存下来*/
{
point[i++]=p-1;
}
while((*p!='\0')&&isalpha(*p++));/*跳过单词*/
}
i=i-1;/*回到最后一个单词的起始字母位置*/
while((i>=0)||(*o!='\0'))
{

while((*o!='\0')&&!isalpha(*o))/*如果非字母,拷贝到目标字符串*/
{
*d++=*o++;
}
if(isalpha(*o))/*如果下一个是字母而不是结束标志*/
{
while(isalpha(*point[i]))/*将单个单词以倒叙方式拷贝到目标字符串*/
{
*d++=*point[i]++;
}
}
while((*o!='\0')&&isalpha(*o))/*跳过单词*/
{
*o++;
}
i--;
}
*d='\0';/*添加结束标志*/
}
Queequeg_zz 2009-12-19
  • 打赏
  • 举报
回复
[code=c/c++]
void divs(char *p,char *d)
{
int i=0;
char *o;/*必须保存源字符串起始指针,因为第二步要将源字符串拷贝到目标字符串*/
o=p;
char *point[100];/*获取每个单词在字符串中的位置,为下面将单词倒叙拷贝*/
while(*p!='\0')
{
while((*p!='\0')&&!isalpha(*p++));/*跳过非字母*/
if(isalpha(*p))/*如果是字母而不是结束符,就将单词起始字母在字符串中的位置保存下来*/
{
point[i++]=p-1;
}
while((*p!='\0')&&isalpha(*p++));/*跳过单词*/
}
i=i-1;/*回到最后一个单词的起始字母位置*/
while((i>=0)||(*o!='\0'))
{

while((*o!='\0')&&!isalpha(*o))/*如果非字母,拷贝到目标字符串*/
{
*d++=*o++;
}
if(isalpha(*o))/*如果下一个是字母而不是结束标志*/
{
while(isalpha(*point[i]))/*将单个单词以倒叙方式拷贝到目标字符串*/
{
*d++=*point[i]++;
}
}
while((*o!='\0')&&isalpha(*o))/*跳过单词*/
{
*o++;
}
i--;
}
*d='\0';/*添加结束标志*/
}
[/code]
hlyces 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mstlq 的回复:]
正确但是绝对欠揍的代码,楼主别学……
C/C++ code
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>char words[50][256],symbols[50],dest[256];int main()
{char*str="how@are#you?";char*src=str,*des=dest;int i=0,widx=0,widx2=0,sidx=0;for(;*src!='\0'; isalpha(*src)? (words[widx][widx2++]=*src++) :(widx++,widx2=0,symbols[sidx++]=*src++));for(i=0;i<widx;i++)for(src=words[widx-i-1];*src!='\0'|| (*des++=symbols[i],0);*des++=*src++);
puts(dest);return0;
};
[/Quote]
=============================
nc
dongdong814617937 2009-12-19
  • 打赏
  • 举报
回复
这篇帖子我学到了用栈改变字符顺序的方法,很好,继续交流!
chenfeng2002 2009-12-19
  • 打赏
  • 举报
回复
5楼的方法比较好,主要是不需要借助其他函数,面试的时候基本有这个限制。
huangyu_2008 2009-12-19
  • 打赏
  • 举报
回复
学习。。。。
yzx714 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 thy38 的回复:]
偏要用Split,呵呵:
C/C++ code#include"stdio.h"
#include"ctype.h"
#include"string.h"#define MAX 100int main()
{char str[]="how@are#you?My=name%is&thy38";char result[MAX]="\0";char* pp[MAX];char splits[MAX][2];int token=0, split=0, i=0;//分隔符都换成空格for(i=0; i<strlen(str);++i) {if(isalnum(str[i]))continue;
splits[split][0]= str[i];
splits[split++][1]='\0';
str[i]='';
}//Splitchar* pch= strtok(str,"");while (pch) {
pp[token++]= pch;
pch= strtok (0,"");
}//重组 i=0;while(token) {
strcat(result, pp[--token]);if(i< split) strcat(result, splits[i++]);
}
puts(result);
}
[/Quote]
和我想的一样!
  • 打赏
  • 举报
回复
[Quote=引用楼主 beatles_the 的回复:]
反转一句话中的单词,例如“how@are#you?”反转为:“you@are#how?”
我搜索了大部分的解答,都是说先反转整句然后反转各个单词,请注意标点符号,例如例子中的?号反转后还是在最后面的
请大家考虑的时候,用C来考虑,不要用什么split之类的函数,分隔符不仅仅是空格,但是单词仅有大小写字母构成,注意反转后标点的位置。
[/Quote]

建立一个栈,里面可以存字符串,遇到非英文字符就把当前字符串压栈,并用一个数组记录这个非英文字符,最后出栈即可。
you 结束
are # 压栈 数组1:#
how @压栈 数组0:@

出栈
输出:
you 读数组0:@
are 1:#
how
thy38 2009-12-19
  • 打赏
  • 举报
回复
偏要用Split,呵呵:
#include "stdio.h"
#include "ctype.h"
#include "string.h"
#define MAX 100

int main()
{
char str[] = "how@are#you?My=name%is&thy38";
char result[MAX]="\0";
char* pp[MAX];
char splits[MAX][2];
int token=0, split=0, i=0;

//分隔符都换成空格
for(i=0; i<strlen(str); ++i) {
if(isalnum(str[i])) continue;
splits[split][0] = str[i];
splits[split++][1] = '\0';
str[i] = ' ';
}

//Split
char * pch = strtok(str, " ");
while (pch) {
pp[token++] = pch;
pch = strtok (0, " ");
}

//重组
i=0;
while(token) {
strcat(result, pp[--token]);
if(i < split) strcat(result, splits[i++]);
}
puts(result);
}
crazy-one 2009-12-19
  • 打赏
  • 举报
回复
眼花缭乱啊,好大堆书要复习啊
wspchina 2009-12-19
  • 打赏
  • 举报
回复
谢谢,学习了
skyworth98 2009-12-19
  • 打赏
  • 举报
回复
一个栈放单词,先进后出
一个缓冲区放单词,遇到符号,缓冲区入栈
一个队列放符号

最后一个单词出栈,之后一个符号出栈直至单词栈为空

[Quote=引用 6 楼 haozi8993 的回复:]
用两栈,一个放单词,一个放标点,单词倒序出栈,标点顺序出栈,空格自己补.
[/Quote]
CLangFans 2009-12-19
  • 打赏
  • 举报
回复
学习了...
areegod 2009-12-19
  • 打赏
  • 举报
回复
我也写了 100多行,,,,
加载更多回复(6)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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